Hilfe bei Brainfuck Interpreter
-
Hi,
ich bin gerade dabei aus langeweile einen Brainfuck Interpreter zu schreiben.
Ich habe alle Befehle drinne nur die Schleife funktioniert nicht ganz korrekt.
Sie klappt, aber bei Verschachtelungen streikt sie. Vielleicht hat jemand eine Idee, wie man das besser lösen könnte oder wo bei mir der (Denk)-Fehler liegt.// [...] case '[': { std::string strTemp; m_LoopDepth++; i++; while ( true ) { i++; if ( strLine[i] == '[' ) m_LoopDepth++; if ( strLine[i] == ']' ) { m_LoopDepth--; } if ( m_LoopDepth == 0 ) break; else strTemp += strLine[i]; } std::cout << strTemp << std::endl; // Debug while ( *m_VecMemoryIt ) { Interpret( strTemp ); // Rekursion } } break; // [...]Viele Grüße
-
Warum denn so umständlich?
Wenn ein [ kommt packst du die aktuelle "Adresse" oben auf den Stack, beim ] musst du dann entweder
- mit pop() das ganze wieder runternehmen wenn die Schleife fertig ist
oder
- zur Adresse top()+1 springen.
-
Achja Danke für den Hinweis übrigens wollte meinen mal fertig programmieren nun hab ich es schnell gemacht

-
Hi,
danke für die Erklärung, aber so ganz mit klar kommen tu ich nicht
Kannste das nicht mal in Code ausdrücken? Ich bin am Verzweifeln...
Gruß
-
stack<size_t> callstack; // eigentlich das falsche wort, naja... // wenn [ gefunden: callstack.push(aktuelleAdresse + 1); // wenn ] gefunden: if(aktuelleZelle == 0) { callstack.pop(); } else { setzeAdresse(callstack.top()); }
-
@IchNooB!:
In deinem ursprünglichen Code ist der 1. Fehler IMHO das "case '['" - das müsste "case ']'" heissen. Die [ kannst du eigentlich komplett ignorieren beim normalen Ausführen des Programmes, einzig wenn du auf ein ] triffst musst du das dazupassende [ suchen, und in der Zelle danach weitermachen.
Die Variante von "Entenwickler" ist aber sicher schneller.
----
Was mir zum Thema Brainfuck noch eingefallen ist: es wäre mal interessant nen "schlauen" Brainfuck Interpreter zu schreiben, der gewisse Patterns erkennen kann, und die dann optimiert ausführt. Sollte eigentlich nicht soooo wahnsinnig schwer sein, die Frage wäre wie weit man das treiben kann

-
Hi,
erstmal danke für eure Antworten, aber so ganz weitergebracht hat mich das auch nicht. Einfache Schleifen ohne Verschachtelungen haben ja vorher auch schon funktioniert und es ging mir nun um richtige Verschachtelung und ich glaube der Code tut das nicht 100% richtig.while ( true ) { while ( true ) // Er führt ja erst diese aus und dann die da rüber? { // ... } }Oder habe ich das falsch implentiert? Mit der + 1 gehts jedenfalls ganz schief!
case '[': LoopStack.push( m_nPosInFile ); break; case ']': if ( *MemoryIt != 0 ) { m_nPosInFile = LoopStack.top(); } else { LoopStack.pop(); } break;Vielleicht habt ihr ja auch einen Brainfuck-Code mit einer vernünftigen Verschachtelung zum Austesten.
Viele Grüße