From d0e98e54ce0865dd949ec3f973b0cce96e3cb2c7 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 17 Dec 2023 18:50:39 +0100 Subject: [PATCH] arith a bit --- .gitignore | 3 ++ src/arithmetic.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 .gitignore create mode 100644 src/arithmetic.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0020b40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +src/__pycache__ +src/parser.out +src/parsetab.py diff --git a/src/arithmetic.py b/src/arithmetic.py new file mode 100644 index 0000000..037d67a --- /dev/null +++ b/src/arithmetic.py @@ -0,0 +1,80 @@ +import ply.yacc +import ply.lex + +# scanner +tokens = [ + 'NUMBER', + 'EXP' +] + +literals = ['+', '*', '(', ')'] + +t_ignore = '\n\t ' + +def t_error(t): + print(f"error: '{t}'") + +def t_NUMBER(t): + r'0|[1-9][0-9]*' + t.value = int(t.value) + return t + +def t_EXP(t): + r'\*\*' + pass + +lexer = ply.lex.lex() + +# parser +start = 'start' + +def p_start(p): + "start : expr" + print(p[1]) + +def p_expr_sum(p): + "expr : expr '+' prod" + p[0] = p[1] + p[3] + return p + +def p_expr_prod(p): + "expr : prod" + p[0] = p[1] + return p + +def p_prod_prod(p): + "prod : prod '*' pow" + p[0] = p[1] * p[3] + return p + +def p_prod_pow(p): + "prod : pow" + p[0] = p[1] + return p + +def p_pow_exp(p): + "pow : fac EXP pow" + p[0] = p[1] ** p[3] + return p + +def p_pow_fac(p): + "pow : fac" + p[0] = p[1] + return p + +def p_fac_inner(p): + "fac : '(' expr ')'" + p[0] = p[2] + return p + +def p_fac_num(p): + "fac : NUMBER" + p[0] = int(p[1]) + return p + +parser = ply.yacc.yacc() +while True: + s = input('calc> ') + ply.yacc.parse(s) + if s == '': + break