Taas yksi BrainFuck tulkki. Tiedän, että täältä löytyy jo muutama, ja ne ovat moninverroin parempia. Oma koodini on täyttä purkkaa, aiheuttaa vaikka mitä muistivuotoja jne eikä sisällä virheiden käsittelyä. Ottakaa silti huomioon, että olen vasta 14v ja tämä on ensimmäinen C++ projekti :)
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <fstream>
#include <string>
using namespace std;
// Class for variables
class RVariable
{
public:
// Prototypes
int GetFunctionPoint();
int GetValue();
int Increase();
int Decrease();
int Init();
int SetValue(int);
private:
int functionp;
char value;
};
int RVariable::GetFunctionPoint()
{
return functionp;
}
int RVariable::GetValue()
{
return value;
}
int RVariable::Increase()
{
value++;
}
int RVariable::Decrease()
{
value--;
}
int RVariable::Init()
{
value=0;
functionp=0;
}
int RVariable::SetValue(int val)
{
value=val;
}
// Prototypes
string LoadCode(string);
void Compile(string);
/*
TEH MAIN()
*/
int main(int argc, char *argv[])
{
Compile("code.txt");
}
// Function which loads the code
string LoadCode(string obj)
{
string code;
string rcode;
ifstream myfile(obj.c_str());
if(myfile.is_open())
{
string some;
while(!myfile.eof())
{
getline(myfile,some);
code = some;
for(int i=0;i<code.length();i++)
{
// Add only compileable letters
if(code.substr(i,1)=="<" || code.substr(i,1)==">" ||
code.substr(i,1)=="+" || code.substr(i,1)=="-" ||
code.substr(i,1)=="[" || code.substr(i,1)=="]" ||
code.substr(i,1)=="." || code.substr(i,1)==",")
{
rcode += code.substr(i,1);
}
}
}
myfile.close();
}
return rcode;
}
// Function which compiles
void Compile(string obj)
{
// Variables
int memory = 10000;
RVariable Variable[memory];
for(int i=0;i<memory;i++) Variable[i].Init();
// "Pointers"
int varpointer=0;
int codepointer=0;
// Loop
int loopstart[255];
for(int i=0;i<255;i++) loopstart[i]=0;
int loopavoids=0;
int loopgoing=0;
// Read code
int slen = LoadCode(obj.c_str()).length();
const char *now = LoadCode(obj.c_str()).c_str();
bool tf=false;
while(tf==false)
{
if(codepointer>slen+2) tf=true;
if(loopavoids==0)
{
// Next Cell
if(now[codepointer]==62)
{
varpointer++;
if(varpointer>memory) break;
// Prev Cell
}else if(now[codepointer]==60)
{
varpointer--;
if(varpointer<0)varpointer=0;
// Halt
}else if(now[codepointer]==44)
{
Variable[varpointer].SetValue(_getch());
// Loop Start Block
}else if(now[codepointer]==91)
{
loopgoing++;
loopstart[loopgoing]=codepointer;
if(Variable[varpointer].GetValue()==0)
{
loopavoids++;
}
// Loop End Block
}else if(now[codepointer]==93)
{
if(Variable[varpointer].GetValue()!=0)
{
codepointer = loopstart[loopgoing];
loopgoing++;
}
loopgoing--;
// Increase
}else if(now[codepointer]==43)
{
Variable[varpointer].Increase();
// Decrease
}else if(now[codepointer]==45)
{
Variable[varpointer].Decrease();
// Print
}else if(now[codepointer]==46)
{
cout << char(Variable[varpointer].GetValue());
}
}else if(now[codepointer]==91)
{
loopgoing++;
loopavoids++;
}else if(now[codepointer]==93)
{
loopgoing--;
loopavoids--;
}
if(loopavoids<1) loopavoids=0;
codepointer++;
}
}Aihe on jo aika vanha, joten et voi enää vastata siihen.