User:Sgeo/ffbimp
Jump to navigation
Jump to search
Currently, you need to manually strip (comments and?) newlines out of programs...
#!/usr/bin/python the_code = [] dot_value = 0 #Yes, I know Python needs no variable declaration! bang_value = 0 from pyparsing import Word, nums, oneOf, ParseException import sys lvars = '?!.' + nums rvars = '!.' line = Word(lvars) + "and" + Word(lvars) + "and" + Word(lvars) + ", oh my" + oneOf('! . ...') the_code = open(sys.argv[1]).read().splitlines() def process_code(code): #A bit inaccurate, compiles p_code = [] #Should be a list of 4-tuples. for i in code: try: i = line.parseString(i) except ParseException: print i raise del i[5] del i[3] del i[1] i = tuple(i) p_code.append(i) return p_code def do_code(p_code): global dot_value global bang_value nextline = 0 while True: i = nextline v = p_code[i] v = list(v) using_out = False using_next = False using_bang = False for j, k in enumerate(v): if k == '!': v[j] = bang_value if j==3: using_bang = True elif k == '.': v[j] = dot_value if j==3: using_out = True elif k == '?': try: t = ord(raw_input()[0]) if t >=0 and t <256: v[j] = t else: raise ValueError except IndexError: v[j]=0 elif k == '...': v[j] = i using_next = True #elif int(k) < 0 or int(k) >= 256: # raise ValueError else: v[j] = int(v[j]) #print "At instruction " + str(i) + ":",str(v) ans = (v[0] & v[1]) | (v[2] & v[3]) if using_out: sys.stdout.write(chr(ans)) dot_value = ans if using_next: nextline = ans else: nextline+=1 if using_bang: bang_value = ans #print nextline if __name__=='__main__': p_code = process_code(the_code) try: do_code(p_code) except IndexError: print sys.exit()