用 ply 制作计算器

来源:互联网 发布:js中怎样定义一个数组 编辑:程序博客网 时间:2024/05/18 18:54

import ply.leximport ply.yacctokens = ( "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 tt_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 )


0 0