Zeichenerkennung in Schleife

  • Hey Hey. Ich bin sowas von am Ende. Also ich hab mir mal nen Brainfuck Interpreter gebastelt. Warum? Weil es bis jetzt noch keinen in AutoIt gibt (BugFix' konvertiert ja nur Outputs nach BF).

    Bis jetzt funktioniert alles. Zum Test einfach mal "+++++(>+++<-)>." eingeben. Das ist die Multiplikation von 3 und 5, die am Ende mit "." in die Konsole geschrieben wird. Wie man sieht funktioniert das Ding mit einer Schleife "(...)", die so lang läuft bis die Zelle auf die der Pointer "$Cell" gerade zeigt vom Wert her "$Program[$Cell]" gleich "0" ist.

    So. Um jetzt aber beispielsweise 5^3 zu rechnen müssen wir mit verschachtelten Schleifen arbeiten, das sieht dann so aus: "+++++(>+++++(>+++++<-)<-)", Output mit ">>." . Dieser Code funktioniert auch, wie man hier testen kann. Wie man dort sehen kann (Step-by-Step) springt der Pointer nachdem er von der ersten Zelle "1" abgezogen hat in die zweite um dort um "5" aufzufüllen. Soweit kommt mein Skript noch mit. Aber dann springt der Pointer nicht wie es nötig wäre auf Zelle 3 um dort gegen "1" nochmals 5 aufzuaddieren, sondern springt zu Zelle 1, danach bricht das ganze dann logischerweise zusammen. :pinch:

    Mein Schleifensystem funktioniert so: Wenn der Codepointer (der den aktuellen Befehl liest) einen Loopanfang "(" findet, speichert er die Position im Quellcode des Befehls in den Looparray. Dann läuft der Codepointer weiter um alle nachfolgenden Befehle auszuführen, sollte er indes wieder auf ein "(" treffen, so wird der Looparray um den neuen Wert erweitert, so ist die Codeposition der Sprungmarke "(" des letzten Loops im letzten Slot des Arrays gespeichert. Trifft der Codepointer nun auf ein BACK, also ")", welches den Pointer anweist, solang der Zellenwert größer als "0" ist, auf die letzte Sprungmarke "(" zurückzuspringen, wird der Codepointer auf die letzte (wird aus dem Looparray gelesen) Sprungmarke "(" gesetzt. Ist die Zelle "0" dann wird die letzte Sprungmarke gelöscht, der Looparray geredimt. Sollte ja theoretisch funktionieren :D

    Autofuck, wie mein Skript heißt benutzt "(" und ")" statt "[" und "]" wie bei Brainfuck. Mit "." wird der absolute Wert der Zelle ausgeben, also das was drin steht, und mit ":" der dem Zellwert entsprechende ASCII Character.

    Irgendwo ist der Wurm drin :wacko: . Aber wo?


    Das Skript ist im Anhang. Vielen Dank für eure Geduld!

    2 Mal editiert, zuletzt von minx (15. Juli 2012 um 03:13)

  • Ok, dann suchst du den Anfang der Schleife, das Ende, und natürlich den Code dazwischen.
    Diesen übergibst du dann erneut an deinen BF-Interpreter (-> Rekursion).

  • Ich hab mir jetzt das Beipsiel mit Dll Strukturen rausgesucht, das kann ich noch besser nachvollziehen, und es funktioniert!

    Trotzdem Danke