Aubergine/aubergine.py
Jump to navigation
Jump to search
This is an implementation of Aubergine in Python by User:Quintopia. There are no frills or flags to make debugging easier, though error messages are fairly robust. Thanks to Python magic, integers are arbitrarily large, and therefore this interpreter is capable of running the universal Minsky machine. It can be imported as a module without problems. This limitation may be eliminated someday, but the primary goal of "having an Python implementation" has been achieved.
import sys def load(filename): try: openfile = open(filename, "r") except IOError: print("File '"+filename+"' not found."); sys.exit(1) else: listing = map(ord,list(openfile.read())); openfile.close(); return listing def get(data,id): if id==ord("1"): return 1 if id==ord("a"): return data.a if id==ord("b"): return data.b if id==ord("A"): try: return data.listing[data.a] except IndexError: raise IndexError(str(data.a)+" is invalid index into program at character "+str(data.ip+2)+".") if id==ord("B"): try: return data.listing[data.b] except IndexError: raise IndexError(str(data.b)+" is invalid index into program at character "+str(data.ip+2)+".") if id==ord("o"): return ord(sys.stdin.read(1)) #blocks and waits for an input if buffer empty, reads 1 byte if id==ord("i"): return data.ip try: id = chr(id) except ValueError: try: id = unichr(id) except ValueError: id = str(id) raise ValueError(id + "is an invalid source argument at character "+str(data.ip+2)+".") def put(data,id,val): if id==ord("a"): data.a=val elif id==ord("b"): data.b=val elif id==ord("A"): try: data.listing[data.a]=val except IndexError: raise IndexError(str(ord(data.a))+" is invalid index into program at character "+str(data.ip+1)+".") elif id==ord("B"): try: data.listing[data.b]=val except IndexError: raise IndexError(str(ord(data.b))+" is invalid index into program at character "+str(data.ip+1)+".") elif id==ord("o"): try: sys.stdout.write(chr(val)) except ValueError: try: sys.stdout.write(unichr(val)) except ValueError: pass elif id==ord("i"): data.ip=val else: try: id = chr(id) except ValueError: try: id = unichr(id) except ValueError: id = str(id) raise ValueError(id + " is an invalid target argument at character "+str(data.ip+1)+".") def run(data): while data.ip>=0 and data.ip<len(data.listing)-2: x=data.listing[data.ip] y=data.listing[data.ip+1] z=data.listing[data.ip+2] if (z==ord("o") or y==ord("o")) and x!=ord('='): raise ValueError('o used as source or target of non-assignment command at character '+str(data.ip)+'.') if x==ord("="): put(data,y,get(data,z)) elif x==ord("+"): put(data,y,get(data,y)+get(data,z)) elif x==ord("-"): put(data,y,get(data,y)-get(data,z)) elif x==ord(":"): if get(data,z)!=0: data.ip = get(data,y) else: try: x=chr(x) except ValueError: try: x=unichr(x) except ValueError: x=str(x) raise SyntaxError("Invalid instruction ("+x+") at character "+str(data.ip)+".") data.ip = data.ip+3 if __name__=="__main__": class Aubergine: def __init__(self, listing, a, b, ip): self.listing = listing self.a = a self.b = b self.ip = ip if len(sys.argv)<2: print "No filename to execute." else: listing = load(sys.argv[1]) data = Aubergine(listing, 0, 0, 0) run(data)