用 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 )
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 )
相关文章推荐
- xtrabackup一键自动化备份脚本 V2 版【原创】
- 如何快速导入大SQL文件到MySQL数据库?
- 朴素贝叶斯法的学习与分类
- opencv2-2渐变过渡各种图形滤波并输出文字
- google android audio presentation
- 32位系统-数据类型占内存字节数
- WinForm(C#)中跨线程访问控件的解决方法
- lua中table如何安全移除元素
- Swift - 告警提示框(UIAlertController)的用法
- 设计模式的六大原则
- c++primer 第三章习题(4)
- ffmpeg 的时间单位
- apache 目录认证
- 详解Java类库的概念以及import的使用方法
- JDK、JRE、JVM三者间的关系
- 将Ojective-C代码移植转换为Swift代码
- 提高SQL查询效率
- WebM: 一个开放、免费的媒体文件格式
- Android 4.4 沉浸式透明状态栏与导航栏
- linuxshell中"2>&1"含义