import sys commands = { # empty space "_" : (0, None), # actions "." : (1, "pass"), "pit0" : (1, "pitcher = 0"), "pit+1" : (1, "pitcher += 1"), "pit-1" : (1, "pitcher = max(pitcher - 1, 0)"), "mem0" : (1, "memory = 0"), "mem+p" : (1, "memory += pitcher"), "mem-p" : (1, "memory = max(memory - pitcher, 0)"), "fl0+" : (1, "fl0 = True"), "fl0-" : (1, "fl0 = False"), "fl1+" : (1, "fl1 = True"), "fl1-" : (1, "fl1 = False"), "rfwd" : (1, "mr.step_forward()"), "rleft" : (1, "mr.turn_left()"), "rright" : (1, "mr.turn_right()"), "rfix" : (1, "mr.fix_cell()"), "rtow" : (1, "mr.tow()"), # for Tower # subroutines "@" : (3, "proc_main()"), "A" : (3, "proc_A()"), "B" : (3, "proc_B()"), "C" : (3, "proc_C()"), "D" : (3, "proc_D()"), # fixed repeaters "(0)" : (2, 0), "(1)" : (2, 1), "(2)" : (2, 2), "(3)" : (2, 3), "(4)" : (2, 4), "(5)" : (2, 5), "(6)" : (2, 6), # dynamic repeaters, vars only "(pit)" : (4, "pitcher"), "(mem)" : (4, "memory"), # if conditionals "" : (5, "(pitcher > 0)"), "" : (5, "(pitcher <= 0)"), "" : (5, "(memory > 0)"), "" : (5, "(memory <= 0)"), "" : (5, "(memory == pitcher)"), "" : (5, "(memory != pitcher)"), "" : (5, "(memory < pitcher)"), "" : (5, "(memory <= pitcher)"), "" : (5, "(memory > pitcher)"), "" : (5, "(memory >= pitcher)"), "" : (5, "fl0"), "" : (5, "not fl0"), "" : (5, "fl1"), "" : (5, "not fl1"), "" : (5, "mr.path_clear()"), "" : (5, " not mr.path_clear()"), "" : (5, "mr.can_step_forward()"), #for Mover "" : (5, "not mr.can_step_forward()"), #for Mover "" : (5, "mr.cell_normal()"), "" : (5, "not mr.cell_normal()"), "" : (5, "mr.cell_broken()"), "" : (5, "not mr.cell_broken()"), "" : (5, "mr.cell_fixed()"), "" : (5, "not mr.cell_fixed()"), # while conditionals "[pit]" : (6, "(pitcher > 0)"), "[!pit]" : (6, "(pitcher <= 0)"), "[mem]" : (6, "(memory > 0)"), "[!mem]" : (6, "(memory <= 0)"), "[memeq]" : (6, "(memory == pitcher)"), "[memne]" : (6, "(memory != pitcher)"), "[memlt]" : (6, "(memory < pitcher)"), "[memle]" : (6, "(memory <= pitcher)"), "[memgt]" : (6, "(memory > pitcher)"), "[memge]" : (6, "(memory >= pitcher)"), "[fl0]" : (6, "fl0"), "[!fl0]" : (6, "not fl0"), "[fl1]" : (6, "fl1"), "[!fl1]" : (6, "not fl1"), "[rclear]" : (6, "mr.path_clear()"), "[!rclear]" : (6, "not mr.path_clear()"), "[rfwd]" : (6, "mr.can_step_forward()"), #for Mover "[!rfwd]" : (6, "not mr.can_step_forward()"), #for Mover "[rcnor]" : (6, "mr.cell_normal()"), "[!rcnor]" : (6, "not mr.cell_normal()"), "[rcbro]" : (6, "mr.cell_broken()"), "[!rcbro]" : (6, "not mr.cell_broken()"), "[rcfix]" : (6, "mr.cell_fixed()"), "[!rcfix]" : (6, "not mr.cell_fixed()"), } tab_string = " " def compile_section(lines): stack = [] stack.append((-1, 1)) for l in lines: qb = False lw = l.rstrip().split() ls = len(l.rstrip()) for i in range(ls): ci = l[i] if not ci in commands: print("Unknown symbol", i, ord(ci), file=sys.stderr) ci = "." cci = commands[ci] if cci[0] == 0: continue if not qb: while stack[-1][0] >= i: stack.pop() assert stack qb = True print(tab_string * stack[-1][1], end=''); if cci[0] == 1 or cci[0] == 3: print(cci[1]) elif cci[0] == 2: # fixed repeaters print("for _ in range(" + str(cci[1]) + "):") stack.append((i, stack[-1][1] + 1)) elif cci[0] == 4: # dynamic repeaters (pitcher and memory) print("for _ in range(" + cci[1] + "):") stack.append((i, stack[-1][1] + 1)) elif cci[0] == 5: # if conditionals print("if "+ cci[1] + ":") stack.append((i, stack[-1][1] + 1)) elif cci[0] == 6: # while conditionals print("while "+ cci[1] + ":") pass # for i in range(ls) pass # for l in lines def precompile_program(): res = [None] * 5 for i in range(5): res[i] = list() main_section = 0 cur_section = 0 cur_skip = True for l in sys.stdin: lw = l.rstrip().split() while lw and (lw[-1] == "_"): lw.pop() ls = len(lw) if ls == 0: cur_skip = True continue if cur_skip and (ls == 1) and (lw[0] in commands) and (commands[lw[0]][0] == 3): # selecting another section cur_section = ord(lw[0][0]) - ord('@') print("Section " + str(i) + " selected.", file=sys.stderr); if main_section == 0: main_section = cur_section continue cur_skip = False res[cur_section].append(lw) if (not res[0]) and (main_section > 0): res[0].append([chr(ord('@') + main_section)]) return res def main(): codes = precompile_program() cn = len(codes) print("import MoscowRobots as mr") print() print("pitcher = 0") print("memory = 0") print("fl0 = False") print("fl1 = False") print() for i in range(cn): sname = commands[chr(ord('@') + i)][1] print("def " + sname + ":") compile_section(codes[i]) print(" pass\n") print("proc_main()") main()