# python 3.5 # read in a brainfuck file and generate a python program that executes the bf commands # source file: a.txt # output file: za.py indent = " " indent_level = 0 ws = "" steps = 0 f_out = open('za.py', 'w') f_out.write("# Python 3.5\n\n" "# First, count how many commands\n" "f = open('a.txt', 'r')\n" "prevch = ''\n" "nextch = ''\n" "command_count = 0\n" "command_set = '><+-,.[]'\n" "\n" "while True:\n" " nextch = f.read(1)\n" " if(not nextch): break\n" "\n" " if(nextch in command_set):\n" " command_count += 1\n" "f.close()\n" "# Build the executable================\n" "from array import array\n" "\n" "P = 0\n" "high_P = 0\n" "steps = 0\n" "indent = ' '\n" "indent_level = 0\n\n" "m_size = 32\n" "m = array('B')\n" "m = [ 0 for i in range(m_size)]\n" "\n" "def dump():\n" " print()\n" " print('|', end = '')\n" " for i in range(high_P + 1):\n" " if(i == P):\n" " left = '('\n" " right = ')'\n" " else: left = right = ' '\n" " print(left + '%03d' % i + ':' + '%03d' % m[i] + right, end = '|')\n" "\n" "def right():\n" " global P\n" " global high_P\n" " global steps\n" " steps += 1\n" " P += 1\n" " high_P = max(P, high_P)\n" "\n" "def left():\n" " global P\n" " global steps\n" " steps += 1\n" " P -= 1\n" "\n" "def plus():\n" " global P\n" " global steps\n" " steps += 1\n" " m[P] = (m[P] + 1) % 256\n" "\n" "def minus():\n" " global P\n" " global steps\n" " steps += 1\n" " m[P] = (m[P] - 1) % 256\n" "\n" "def key():\n" " global P\n" " global steps\n" " steps += 1\n" " j = input('char: ')\n" " if(len(j) > 0):\n" " m[P] = ord(j[0])\n" " else:\n" " m[P] = 0\n" "\n" "def emit():\n" " global P\n" " if((m[P] > 31 and m[P] < 127 or m[P] == 10)):\n" " print(chr(m[P]), end = '')\n" "\n" "def pause():\n" " dump()\n" " print()\n" " j = input('continue')\n" "\n" "# The Program:\n\n" ) f_in = open('a.txt', 'r') while True: nextch = f_in.read(1) if(not nextch): break if(nextch == ">"): ws = (indent * indent_level) + "right()\n" f_out.write(ws) elif(nextch == "<"): ws = (indent * indent_level) + "left()\n" f_out.write(ws) elif(nextch == "+"): ws = (indent * indent_level) + "plus()\n" f_out.write(ws) elif(nextch == "-"): ws = (indent * indent_level) + "minus()\n" f_out.write(ws) elif(nextch == ","): ws = (indent * indent_level) + "key()\n" f_out.write(ws) elif(nextch == "."): ws = (indent * indent_level) + "emit()\n" f_out.write(ws) elif(nextch == "["): ws = (indent * indent_level) + "while(m[P] > 0):\n" f_out.write(ws) indent_level += 1 ws = (indent * indent_level) + "steps += 2\n" f_out.write(ws) elif(nextch == "]"): indent_level -= 1 elif(nextch == "#"): ws = (indent * indent_level) + "pause()\n" f_out.write(ws) elif(nextch == "!"): ws = (indent * indent_level) + "dump()\n" f_out.write(ws) else: pass f_out.write("print()\n") f_out.write("print(command_count, 'commands')\n") f_out.write("print(steps, 'steps')\n") f_in.close() f_out.close()