Brainfuck Interpreter in C++...
-
Hallo erstmal!

Ich hoffe mal das hier ist das richtige Forum für meine Angelegenheit.
Also ich arbeite mit dem Borland C++ Builder und will einen Editor/Interpreter für Brainfuck (wer die Sprache nicht kennt: http://cydathria.com/bf/) schreiben, nur leider hänge ich beim Interpreter fest.
Die Befehle + - > < , und . sind ja kein Problem, ich komme aber nicht bei der Schleife (also mit [ und ]) weiter.
Ich habe mir die Quelltexte von einigen anderen Compilern und Interpretern angesehen und dann eine für mich recht nachvollziehbare Lösung gefunden. Das sieht jetzt so aus:(Bitte mal über die Namensgebung der Variablen und den Programmierstil hinwegsehen, ich wollte es mir möglichst einfach machen -> programmiere noch nicht lange mit c++)
EditorCode ist ein TRichEdit mit dem Programmcode in Brainfuck
int pos=0;
int p[30000];for(int i=0; i<EditorCode->GetTextLen(); i++) { EditorCode->SelStart = i; EditorCode->SelLength = 1; if(EditorCode->SelText == ">") { if(pos != 30000) {pos++;} } else if(EditorCode->SelText == "<") { if(pos != 0) {pos--;} } else if(EditorCode->SelText == "+") { p[pos]++; } else if(EditorCode->SelText == "-") { if(p[pos] != 0) {p[pos]--;} } else if(EditorCode->SelText == ".") { // ausgabe } else if(EditorCode->SelText == ",") { // eingabe } else if(EditorCode->SelText == "[") { if(p[pos] == 0) { i++; EditorCode->SelStart = i; int SchleifenCounter = 0; while(SchleifenCounter > 0 || EditorCode->SelText != "]") { if(EditorCode->SelText == "[") { SchleifenCounter++; } if(EditorCode->SelText == "]") { SchleifenCounter--; } i++; EditorCode->SelStart = i; } } } else if(EditorCode->SelText == "]") { if(p[pos] != 0) { i--; EditorCode->SelStart = i; int SchleifenCounter = 0; while(SchleifenCounter > 0 || EditorCode->SelText != "[") { if(EditorCode->SelText == "]") { SchleifenCounter++; } if(EditorCode->SelText == "[") { SchleifenCounter--; } } } }Also wenn er ein [ findet, prüft er, ob der wert von p[pos] == 0 ist. Wenn ja, soll er die Schleife überspringen und nach dem zugehörigen ] wieder weitermachen (dabei muss er mögliche Schleifen, die in dieser Schleife sind, mit berücksichtigen).
Findet er ein ], prüft er, ob p[pos] != 0. Denn wenn dies so ist, muss er zurück zum [ und den Inhalt der Schleife ausführen. Ist aber p[pos] == 0, so soll er einfach den folgenden Befehl ausführen.So weit das, was ich aus dem Internet herausgefunden habe. Leider ergibt der Code eine Endlosschleife und ich weiß nicht was ich dagegen tun kann. Kann mir jemand helfen?

Danke schonmal,
DiozakaerfEDIT: Groß-/Kleinschreibung
-
Diozakaerf schrieb:
kann mir jemand helfen?

Dein Arbeitskollege namens Debugger. Und wenn du mal mit ihm den Code durchgehst, merkst du vielleicht, dass du deinen Code-Formatierungsstil nochmals grob überdenken solltest.
-junix
[edit]LInk korrigiert[/edit]
-
ich ignoriere mal die sache mit dem programmierstil:
Diozakaerf schrieb:
bitte mal über die namensgebung der variablen und den programmierstil hinwegsehen, ich wollte es mir möglichst einfach machen
aber ansonsten hats geholfen, konnte den fehler finden. danke...
-
Nicht Programmier sondern Formatierungsstil....
Btw sollte es keinen Unterschied zwischen "kleinen" und "grossen" Listings oder einfachen und schweren Problemen geben. Aus kleinen Listings werden plötzlich grosse und aus einfachen Problemen werden plötzlich Teile von grossen Problemstellungen. Und dann nochmals alles umstilen? kaum...
Ausserdem ist es doch kompliziert immer 2 verschiedene Stile zu unterhalten? (o;Und gerade in obigem Beispiel hast dus dir weniger Einfach als viel mehr das Step-By-Step Debuggen massiv schwerer gemacht....
-junix
-
ja du hast schon recht. ich will das beispiel von oben heute auch noch ändern, sodass es um einiges schneller und einfacher wird. ich wollte nur schonmal generell den lösungsweg fertig haben, damit ich mich später der guten implementierung widmen kann. es war also so gesehen nur ein prototyp um die einzelnen brainfuck befehle richtig auszuwerten.
aber um meinen formatierungsstil zu verbessern, könnte ich ein paar tipps gebrauchen, also wenn du eine seite kennst oder vielleicht auch selbst was dazu sagen kannst, dann nur raus damit

-
mach eine interpretierungs funktion und rufe die rekrusiv auf, wenn du an ein [ kommst und return, wenn du an ein ] kommst und die schleifen variable 0 ist...
-
es funktioniert ja schon so wie ich es habe, es ging mir jetzt nur noch um den formatierungsstil^^