1 # -----------------------------------------------------------------------------
4 # A simple calculator with variables. This is from O'Reilly's
5 # "Lex and Yacc", p. 63.
6 # -----------------------------------------------------------------------------
9 sys
.path
.insert(0,"../..")
15 literals
= ['=','+','-','*','/', '(',')']
19 t_NAME
= r
'[a-zA-Z_][a-zA-Z0-9_]*'
24 t
.value
= int(t
.value
)
26 print "Integer value too large", t
.value
34 t
.lexer
.lineno
+= t
.value
.count("\n")
37 print "Illegal character '%s'" % t
.value
[0]
55 def p_statement_assign(p
):
56 'statement : NAME "=" expression'
59 def p_statement_expr(p
):
60 'statement : expression'
63 def p_expression_binop(p
):
64 '''expression : expression '+' expression
65 | expression '-' expression
66 | expression '*' expression
67 | expression '/' expression'''
68 if p
[2] == '+' : p
[0] = p
[1] + p
[3]
69 elif p
[2] == '-': p
[0] = p
[1] - p
[3]
70 elif p
[2] == '*': p
[0] = p
[1] * p
[3]
71 elif p
[2] == '/': p
[0] = p
[1] / p
[3]
73 def p_expression_uminus(p
):
74 "expression : '-' expression %prec UMINUS"
77 def p_expression_group(p
):
78 "expression : '(' expression ')'"
81 def p_expression_number(p
):
85 def p_expression_name(p
):
90 print "Undefined name '%s'" % p
[1]
94 print "Syntax error at '%s'" % p
.value
96 import ply
.yacc
as yacc
101 s
= raw_input('calc > ')