summaryrefslogtreecommitdiff
path: root/nandgame/assembler/experiments/parser2.py
diff options
context:
space:
mode:
Diffstat (limited to 'nandgame/assembler/experiments/parser2.py')
-rw-r--r--nandgame/assembler/experiments/parser2.py67
1 files changed, 67 insertions, 0 deletions
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()