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/parser1.py | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 nandgame/assembler/experiments/parser1.py (limited to 'nandgame/assembler/experiments/parser1.py') diff --git a/nandgame/assembler/experiments/parser1.py b/nandgame/assembler/experiments/parser1.py new file mode 100644 index 0000000..b845688 --- /dev/null +++ b/nandgame/assembler/experiments/parser1.py @@ -0,0 +1,57 @@ +# 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() -- cgit v1.2.3