Problem mit BF-Interpreter

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Farami

Betreff: Problem mit BF-Interpreter

BeitragDi, März 21, 2006 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Embarassed

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

BeitragDi, März 21, 2006 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich frage mich, wie du mit BB einen Compiler schreiben willst Wink

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

BeitragDi, März 21, 2006 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Justus hat Folgendes geschrieben:
Ich frage mich, wie du mit BB einen Compiler schreiben willst Wink

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. Embarassed
Leider ist der in BMax geschrieben, und in BMax blick ich nich so ganz durch. Sad

Justus

BeitragDi, März 21, 2006 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !!!

BeitragDi, März 21, 2006 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

dark19

Gast

BeitragDi, März 21, 2006 19:24
Antworten mit Zitat
Justus hat Folgendes geschrieben:
Ich frage mich, wie du mit BB einen Compiler schreiben willst Wink

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 ?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group