In [ ]:
import Canvas
def is_num(x):
try:
int(x)
return True
except ValueError:
return False
def process_command(c):
if len(c) == 1:
return c
if len(c) == 2:
return [c[0], int(c[1]) if is_num(c[1]) else c[1]]
return [c[0], int(c[1]) if is_num(c[1]) else c[1], int(c[2]) if is_num(c[2]) else c[2]]
def get_commands(filename):
commands = []
functions = {}
temp_function = []
temp_loop = []
loop_size = 0
with open(filename) as data:
mode = "commands"
r = [s.strip().split() for s in data.readlines() if s.strip()]
print(r)
for x in r:
if x[0] == "define":
temp_function = [x[1]]
mode = "function"
continue
if x[0] == "loop":
mode = "loop"
temp_loop = []
loop_size = int(x[1])
continue
if x[0] == "end":
if mode == "function":
functions[temp_function[0]] = temp_function[1:]
elif mode == "loop":
commands += (temp_loop * loop_size)
mode = "commands"
continue
if mode == "commands":
commands.append(process_command(x))
elif mode == "loop":
temp_loop.append(process_command(x))
elif mode == "function":
temp_function.append(process_command(x))
return commands, functions
def execute(commands, functions, pos):
for c in commands:
if c[0] == "position":
pos = [c[1], c[2]]
Canvas.move(0, pos[0], pos[1])
elif c[0] == "line":
Canvas.create_line(pos[0], pos[1], pos[0] + c[1], pos[1] + c[2])
pos[0] += c[1]
pos[1] += c[2]
elif c[0] == "move":
Canvas.move(0, pos[0] + c[1], pos[1] + c[2])
pos[0] += c[1]
pos[1] += c[2]
elif c[0] == "circle":
r = int(c[1])
Canvas.create_oval(pos[0]-r, pos[1]-r, pos[0]+r, pos[1]+r)
else:
if c[0] in functions:
execute(functions[c[0]], functions, pos)
commands, functions = get_commands("data/test3.txt")
print(commands)
print(functions)
pos = [0, 0]
execute(commands, functions, pos)
Canvas.run()
In [ ]: