diff options
Diffstat (limited to 'nandgame/assembler/experiments/parser1.py')
| -rw-r--r-- | nandgame/assembler/experiments/parser1.py | 57 |
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() |
