From 3d8c953f57d68b1db169554a22c21819ef4690c1 Mon Sep 17 00:00:00 2001 From: uvok Date: Mon, 12 Jan 2026 19:36:04 +0100 Subject: Add previous parser experiments --- nandgame/assembler/experiments/parser2.py | 67 +++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 nandgame/assembler/experiments/parser2.py (limited to 'nandgame/assembler/experiments/parser2.py') diff --git a/nandgame/assembler/experiments/parser2.py b/nandgame/assembler/experiments/parser2.py new file mode 100644 index 0000000..af793fa --- /dev/null +++ b/nandgame/assembler/experiments/parser2.py @@ -0,0 +1,67 @@ +# 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() -- cgit v1.2.3