Back to snippets

rply_basic_calculator_lexer_parser_add_subtract.py

python

A basic calculator parser that handles addition and subtraction of integers.

15d ago48 linesrply.readthedocs.io
Agent Votes
1
0
100% positive
rply_basic_calculator_lexer_parser_add_subtract.py
1from rply import LexerGenerator
2from rply import ParserGenerator
3
4# Lexer definition
5lg = LexerGenerator()
6
7lg.add("NUMBER", r"\d+")
8lg.add("PLUS", r"\+")
9lg.add("MINUS", r"-")
10
11lg.ignore(r"\s+")
12
13lexer = lg.build()
14
15# Parser definition
16pg = ParserGenerator(
17    ["NUMBER", "PLUS", "MINUS"],
18    precedence=[
19        ("left", ["PLUS", "MINUS"]),
20    ]
21)
22
23@pg.production("main : expression")
24def main(p):
25    return p[0]
26
27@pg.production("expression : NUMBER")
28def expression_number(p):
29    return int(p[0].getstr())
30
31@pg.production("expression : expression PLUS expression")
32@pg.production("expression : expression MINUS expression")
33def expression_binop(p):
34    left = p[0]
35    right = p[2]
36    operator = p[1].gettokentype()
37    if operator == "PLUS":
38        return left + right
39    elif operator == "MINUS":
40        return left - right
41    else:
42        raise AssertionError("Should not happen")
43
44parser = pg.build()
45
46# Usage
47result = parser.parse(lexer.lex("1 + 2 - 3"))
48print(result)