您的位置:首页 > 其它

用 ply 制作计算器

2015-09-25 15:28 351 查看
import ply.lex
import ply.yacc

tokens = ( "NAME", "NUMBER" )

literals = [ "=", "+", "-", "*", "/", "(", ")" ]

t_NAME = r"[a-zA-Z_][a-zA-Z0-9_]*"

def t_NUMBER( t ):
r"\d+"
t.value = int( t.value )
return t

t_ignore = " \t"

def t_newline( t ):
r"\n+"
t.lexer.lineno += t.value.count( "\n" )

def t_error( t ):
print( "Illegal character '%s'" % t.value[0] )
t.lexer.skip( 1 )

lexer = ply.lex.lex()

names = {}

def p_Statement( p ):
"""Statement : Experssion
| NAME '=' Experssion"""
if len( p ) == 2:
print p[1]
else:
names[p[1]] = p[3]

def p_exp_Experssion( p ):
"""Experssion : Experssion '+' Term
| Experssion '-' Term
| Term"""
if len( p ) == 2:
p[0] = p[1]
else:
if p[2] == "+":
p[0] = p[1] + p[3]
else:
p[0] = p[1] - p[3]

def p_exp_Term( p ):
"""Term : Term '/' Factor
| Term '*' Factor
| Factor"""
if len( p ) == 2:
p[0] = p[1]
else:
if p[2] == "/":
p[0] = p[1] / p[3]
else:
p[0] = p[1] * p[3]

def p_exp_Factor( p ):
"""Factor : '(' Experssion ')'
| NUMBER"""
if len( p ) == 2:
p[0] = p[1]
else:
p[0] = p[2]

def p_exp_Name( p ):
"""Factor : NAME"""
p[0] = names[p[1]]

def p_error(p):
if p:
print( "Syntax error at '%s'" % p.value )
else:
print( "Syntax error at EOF" )

ply.yacc.yacc()

while True:
try:
s = raw_input( "cal> " )
except EOFError:
break
if not s:
continue
ply.yacc.parse( s )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: