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()
