arith a bit
This commit is contained in:
parent
1c4377b4cb
commit
d0e98e54ce
|
@ -0,0 +1,3 @@
|
||||||
|
src/__pycache__
|
||||||
|
src/parser.out
|
||||||
|
src/parsetab.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
|
Loading…
Reference in New Issue