# parser.py import ply.yacc as yacc from lexer import tokens class Label: def __init__(self, name): self.name = name class Instr: def __init__(self, op, args): self.op = op self.args = args def p_program(p): """program : lines""" p[0] = p[1] def p_lines(p): """lines : lines line | line""" if len(p) == 2: p[0] = [p[1]] else: p[0] = p[1] + [p[2]] def p_line(p): """line : label | instruction | empty""" p[0] = p[1] def p_label(p): """label : IDENT COLON""" p[0] = Label(p[1]) def p_instruction_mov(p): """instruction : MOV REGISTER COMMA NUMBER""" p[0] = Instr("mov", [p[2], p[4]]) def p_instruction_add(p): """instruction : ADD REGISTER COMMA REGISTER""" p[0] = Instr("add", [p[2], p[4]]) def p_instruction_jmp(p): """instruction : JMP IDENT""" p[0] = Instr("jmp", [p[2]]) def p_empty(p): "empty :" p[0] = None def p_error(p): raise SyntaxError("Syntax error") parser = yacc.yacc()