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()


[['position', '50', '100'], ['loop', '10'], ['line', '0', '-80'], ['move', '10', '80'], ['end'], ['position', '120', '120'], ['circle', '20']]
[['position', 50, 100], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['line', 0, -80], ['move', 10, 80], ['position', 120, 120], ['circle', 20]]
{}

In [ ]: