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.