DDR/Python Implementation
Jump to navigation
Jump to search
import sys DDRcode="""code goes here""" DDRcode=DDRcode.split("\n") if not all(arrow in DDRcode[0] for arrow in "<v^>"): raise SyntaxError('Code does not start with "<v^>"') DDRcode=DDRcode[1:] #removing initial <v^> ncode=[0]*len(DDRcode) for i in range(len(DDRcode)): #convert lines to numbers if "<" in DDRcode[i]: #note: only detects if each symbol ncode[i]+=8 #is in each line, thus lines do not if "v" in DDRcode[i]: #need to exactly match commands, ncode[i]+=4 #and allows comments if "^" in DDRcode[i]: ncode[i]+=2 if ">" in DDRcode[i]: ncode[i]+=1 print("DDR Interpreter") print("Input uses one character at a time, and") print(" asks again when each character has been used\n") cp=0 tape=[0] tp=0 brackets=[] function=[] fp=0 var=0 def run_DDR(code,cp,tape,tp,func,fp,brcts,var): while cp < len(code): if code[cp] == 0: #noop pass elif code[cp] == 1: # > tp+=1 if tp==len(tape): tape+=[0] elif code[cp] == 8: # < tp-=1 assert tp>=0, "Attempted to access negative index" elif code[cp] == 2: # + tape[tp]+=1 tape[tp]%=256 elif code[cp] == 4: # - tape[tp]-=1 tape[tp]%=256 elif code[cp] == 6: # . print(chr(tape[tp]), end="") elif code[cp] == 12: # , tape[tp]=ord(sys.stdin.read(1)) elif code[cp] == 10: # [ if tape[tp]==0: while code[cp] != 3: if code[cp] == 9: cp+=2 cp+=1 assert cp < len(code), 'Could not find matching " v>"' else: brcts+=[cp-1] elif code[cp] == 5: # ] cp=brcts[-1] del brcts[-1] elif code[cp] == 3: # . (num) print(tape[tp], end="") elif code[cp] == 14: # var= var=tape[tp] elif code[cp] == 7: # =var tape[tp]=var elif code[cp] == 9: # " " tape[tp]=code[cp+1]*16+code[cp+2] cp+=2 elif code[cp] == 11: # def func(): cp+=1 func=[] while code[cp] != 13: func+=[code[cp]] if code[cp] == 9: cp+=2 cp+=1 assert cp < len(code), "Could not find function end" print(func) elif code[cp] == 13: # call func() nfunc=[] nfp=0 run_DDR(func,fp,tape,tp,nfunc,nfp,brcts,var) elif code[cp] == 15: # halt break cp+=1 run_DDR(ncode,cp,tape,tp,function,fp,brackets,var)