Problem mit BF-Interpreter
Übersicht

FaramiBetreff: Problem mit BF-Interpreter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Ich versuche momentan aus Spaß einen Brainfuck Interpreter zu schreiben. (Für alle denen Brainfuck nichts sagt: http://de.wikipedia.org/wiki/Brainfuck) Allerdings hänge ich bei Schleifen in Schleifen und weiss leider nicht wie ich es lösen soll. Hier mein momentaniges Programm: Code: [AUSKLAPPEN] ;Brainfuck Test ;Globals Global PPos = 0 Global TStr$ = "+++++++++[>+++++<-]>." ;Testweiser String Global Pos = 0 ;Position im String Global StrLen = Len(TStr$) ;Länge des Strings Global MemGr = 100 ;Speichergröße Global CommsExec Dim Mem(MemGr) Const debug = False ;Auf True ändern für debug Print "Programmiert von Farami." Print "Testweiser String: "+TStr Print "String Laenge: "+StrLen Print "" Repeat Bef$ = Mid(TStr, Pos, 1) Select Bef$ Case ">" If PPos < MemGr Then PPos = PPos + 1: If debug = True Then Print "> ("+PPos+")" Case "<" If PPos > 0 Then PPos = PPos - 1: If debug = True Then Print "< ("+PPos+")" Case "+" Mem(PPos) = Mem(PPos) + 1: If debug = True Then Print "+ ("+Mem(PPos)+")" Case "-" If Mem(PPos) > 0 Then Mem(PPos) = Mem(PPos) - 1: If debug = True Then Print "- ("+Mem(PPos)+")" Case "." Write Chr(Mem(PPos)): Print "" Case "[" If debug = True Then Print "Starting loop... ("+(Pos+1)+")" SAnfang = Pos+1 For ii = Pos To StrLen If Mid(Tstr,ii,1) = "]" Then SEnde = (ii-1): Exit Next Loop(SAnfang, SEnde) End Select CommsExec = CommsExec + 1 If debug = True Then Print "Position im Str = "+Pos+ " - Befehl = "+Mid(Tstr, Pos, 1)+" - StrLen = "+StrLen+" - Stack = "+Mem(PPos)+" - StackPos = "+PPos If StrLen = Pos Then Exit Pos = Pos + 1 Forever Print "": Print "" Print "Habe fertig." Print CommsExec+" Befehle ausgefuehrt." WaitKey() End Function Loop(Anfang, Ende) If debug = True Then Print "Pointer Position am Anfang der Schleife: "+PPos+" ("+Mem(PPos)+")" Local LPos = Anfang Local Lent = Ende - Anfang If debug = True Then Print "Laenge der Schleife: "+Lent While Mem(PPos) > 0 For i = 0 To Lent Local Bef$ = Mid(TStr, LPos+i, 1) Select Bef$ Case ">" If PPos < MemGr Then PPos = PPos + 1: If debug = True Then Print "> ("+PPos+")" Case "<" If PPos > 0 Then PPos = PPos - 1: If debug = True Then Print "< ("+PPos+")" Case "+" Mem(PPos) = Mem(PPos) + 1: If debug = True Then Print "+ ("+Mem(PPos)+")" Case "-" If Mem(PPos) > 0 Then Mem(PPos) = Mem(PPos) - 1: If debug = True Then Print "- ("+Mem(PPos)+")" Case "." Write Chr(Mem(PPos)) End Select CommsExec = CommsExec + 1 If debug = True Then Print "Position im Str = "+i+ " - Befehl = "+Mid(Tstr, i, 1)+" - StrLen = "+StrLen+" - Stack = "+Mem(PPos)+" - StackPos = "+PPos Next Wend If debug = True Then Print "Loop Ended." Pos = Ende+1 End Function Kann mir jemand einen Lösungsansatz geben wie ich das mit den Schleifen in Schleifen hinkriegen könnte. ![]() Wäre für jegliche Hinweise sehr dankbar. |
||
- Zuletzt bearbeitet von Farami am Di, März 21, 2006 18:27, insgesamt 2-mal bearbeitet
![]() |
Justus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich frage mich, wie du mit BB einen Compiler schreiben willst ![]() Naja, ein Interpreter ist allerdings möglich und einen solchen findest du hier: http://www.blitz.inarie.de/viewtopic.php?t=912 EDIT: Wundere dich nicht, es handelt sich um BlitzMax und nicht um das gewöhnliche BlitzBasic. |
||
- Zuletzt bearbeitet von Justus am Di, März 21, 2006 18:25, insgesamt einmal bearbeitet
Farami |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Justus hat Folgendes geschrieben: Ich frage mich, wie du mit BB einen Compiler schreiben willst
![]() Naja, ein Interpreter ist allerdings möglich und einen solchen findest du hier: http://www.blitz.inarie.de/viewtopic.php?t=912 Jaaaa. Sorry. Meinte eigentlich auch nen Interpreter. ![]() Leider ist der in BMax geschrieben, und in BMax blick ich nich so ganz durch. ![]() |
||
![]() |
Justus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Diesen Code hier hat Inarie (http://www.Inarie.de) verfasst, ich bin sicher, er hat nichts dagegen, dass du dich daran orientierst.
Code: [AUSKLAPPEN] code$ = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+. +++++++..+++.>++.<<+++++++++++++++.>. +++.------. --------.>+."
Print BrainFuck(code$) WaitKey() Function BrainFuck$(code$) Local codepos% = 1 Local output$ = "" Local stack[15], spointer While codepos <= Len(code$) Select Mid(code$,codepos,1) Case ">" spointer = spointer + 1 Case "<" spointer = spointer - 1 Case "+" stack[spointer] = stack[spointer] + 1 Case "-" stack[spointer] = stack[spointer] - 1 Case "." output$ = output$ + Chr(stack[spointer]) Case "," stack[spointer] = Left(output$,1) output$ = Right(output$,Len(output$)-1) Case "]" If stack[spointer] <> 0 i = codepos a = -1 Repeat i = i - 1 Select Mid(code$,i,1) Case "]" a = a - 1 Case "[" a = a + 1 End Select Until a = 0 codepos = i EndIf End Select codepos = codepos + 1 Wend Return output$ End Function Den entsprechenden Thread findest du hier: http://www.blitz.inarie.de/vie...=brainfuck |
||
antome!!! gesperrt !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Man kann selbstverständlich auch mit BlitzBasic oder Blitz3D einen Compiler schreiben.
Mit jeder Sprache mit der man Textdateien ausgeben und einlesen kann, kann man theoretisch Compiler schreiben. |
||
antome |
dark19Gast |
![]() Antworten mit Zitat |
|
---|---|---|
Justus hat Folgendes geschrieben: Ich frage mich, wie du mit BB einen Compiler schreiben willst
![]() Naja, ein Interpreter ist allerdings möglich und einen solchen findest du hier: http://www.blitz.inarie.de/viewtopic.php?t=912 EDIT: Wundere dich nicht, es handelt sich um BlitzMax und nicht um das gewöhnliche BlitzBasic. Assembler evetuell ? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group