# parser.py import ply.yacc as yacc from lexer import tokens # AST node types 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 : program 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(p): """instruction : MOV REGISTER COMMA NUMBER | ADD REGISTER COMMA REGISTER | JMP IDENT""" op = p[1] args = p[2:] p[0] = Instr(op, args) def p_empty(p): "empty :" p[0] = None def p_error(p): raise SyntaxError("Syntax error") parser = yacc.yacc()