-
Notifications
You must be signed in to change notification settings - Fork 1
/
evalloop.py
64 lines (47 loc) · 1.33 KB
/
evalloop.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from tape import Tape
import sys
def mainloop(program,bracket_map):
tape = Tape()
pc = 0
while pc < len(program):
code = program[pc]
if code == ">":
tape.advance()
elif code == "<":
tape.devance()
elif code == "+":
tape.inc()
elif code == "-":
tape.dec()
elif code == ".":
sys.stdout.write(chr(tape.get()))
elif code == ",":
tape.set(ord(sys.stdin.read(1)))
elif code == "[" and tape.get() == 0:
pc = bracket_map[pc]
elif code == "]" and tape.get() != 0:
pc = bracket_map[pc]
pc += 1
def parse(program):
parsed = []
bracket_map = {}
leftstack = []
pc = 0
for char in program:
if char in ('[',']','<','>','+','-',',','.'):
parsed.append(char)
if char == '[':
leftstack.append(pc)
elif char == ']':
left = leftstack.pop()
right = pc
bracket_map[left] = right
bracket_map[right] = left
pc += 1
return "".join(parsed), bracket_map
def run(input):
program, map = parse(input.read())
mainloop(program,map)
if __name__ == "__main__":
#import pdb; pdb.set_trace()
run(open(sys.argv[1],'r'))