Brain**** Interpreter
Verfasst: Dienstag 11. April 2006, 22:33
Hi,
ich bin mir sicher das kann man an einigen Stellen auch eleganter lösen, aber ich bin ein schlechter 'Programmierer'
bitte Kritik:
Ach ja: ich hab irgendwo im Netz einen wesentlich kleineren Interpreter gefunden, allerdings den Code überhaupt nicht verstanden
ich bin mir sicher das kann man an einigen Stellen auch eleganter lösen, aber ich bin ein schlechter 'Programmierer'
bitte Kritik:
Code: Alles auswählen
#---------------------------+
# tmachine.py |
# von Sebastian (mepnet.de) |
# Datum: 11.4.2006 |
#---------------------------+
class machine:
def __init__(self,space=1024):
self.memory = [0 for i in xrange(0,space,1)] #Speicher
self.pointer = 0 #Speicherzeiger
self.loop_count = 0 #Schleifenzaehler (Syntaktisch [-] etc.)
self.loops = 0 #Schleifenzaehler (Anzahl)
self.loop_source = "" #Source fuer neue Maschineninst.
def load_orders(self,string):
"""Laed global Befehle fuer diese Maschineninstanz
Parameter:
string: String mit BF Syntax"""
self.orders = string
def run(self):
"""Arbeitet alle Befehle ab die mit load_orders geladen wurden"""
for command in self.orders: #Iteriert alle BF Befehle
if command == "[": #Beginn einer Schleife
self.loop_count += 1 #fuer verschachtelte Schleifen
self.loops = self.memory[self.pointer] #Anzahl der Schleifendurchgaenge
elif command == "]":
self.loop_count -= 1
if self.loop_count == 0: #Wenn die Schleifensyntax zuende ist dann...
loop_machine = machine() #neues Objekt das den Code in der Schleife ausfuehrt
loop_machine.set_memory_and_pointer(self.memory,self.pointer)
loop_machine.load_orders(self.loop_source[1:])
for i in xrange(0,self.loops,1): #sooft wie die Schleife ausgefuehrt werden muss
loop_machine.run() #lauft run()
self.memory,self.pointer = loop_machine.get_memory_and_pointer()
if self.loop_count: #den Code einer Schleife aufzeichnen
self.loop_source += command
elif self.loop_count == 0: #aber vielleicht gibt es ja gar keine Schleife ?! dann...
self.memory,self.pointer = self.do_command(command,self.memory,self.pointer)
def do_command(self,command,memory,pointer):
"""do_command fuehrt ein BF Befehl aus
Parameter:
command: der BF Befehl <,>,+,+,,,.,[ oder ]
memory: PythonListe vom Speicher
pointer: Pos. wo der S/L Kopf steht
Ergebnisse:
(memory,pointer): Tupel"""
if command == "+":
memory[pointer] += 1
elif command == "-":
memory[pointer] -= 1
elif command == ">":
pointer += 1
elif command == "<":
pointer -= 1
elif command == ".":
print chr(memory[pointer]),
elif command == ",":
memory[pointer] = ord(raw_input(":"))
return (memory,pointer)
def get_memory_and_pointer(self):
"""Gibt den Speicher und die Pos. vom S/L Kopf zurueck
Ergebnisse:
(memory,pointer): Tupel"""
return self.memory,self.pointer
def set_memory_and_pointer(self,memory,pointer):
"""Laed Speicher und Pos. vom S/L Kopf fuer diese Klasse"""
self.memory = memory
self.pointer = pointer
def show_memory(self):
"""Zeigt den Speicher"""
print "-- MemoryDump --"
print self.memory
print "-- MemoryDump End --"
if __name__ == "__main__":
maschine = machine()
code = """
Beispiel von Wikipedia
++++++++++
[>+++++++>++++++++++>+++>+<<<<-] Schleife zur Vorbereitung der Textausgabe
>++. Ausgabe von 'H'
>+. Ausgabe von 'e'
+++++++. 'l'
. 'l'
+++. 'o'
>++. Leerzeichen
<<+++++++++++++++. 'W'
>. 'o'
+++. 'r'
------. 'l'
--------. 'd'
>+. '!'
>.
"""
maschine.load_orders(code)
maschine.run()
#maschine.show_memory()