summaryrefslogtreecommitdiff
path: root/nandgame/assembler/experiments/parser1.py
diff options
context:
space:
mode:
authoruvok2026-01-12 19:36:04 +0100
committeruvok2026-01-12 19:36:04 +0100
commit3d8c953f57d68b1db169554a22c21819ef4690c1 (patch)
treec9ec41f3a564fec08df6e4ab3f803e36985c4862 /nandgame/assembler/experiments/parser1.py
parent126f8afd68fd590ba96d6c94667b6fc29f89bbb2 (diff)
Add previous parser experiments
Diffstat (limited to 'nandgame/assembler/experiments/parser1.py')
-rw-r--r--nandgame/assembler/experiments/parser1.py57
1 files changed, 57 insertions, 0 deletions
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()