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,"../..")
13 'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
26 t_NAME
= r
'[a-zA-Z_][a-zA-Z0-9_]*'
31 t
.value
= int(t
.value
)
33 print "Integer value too large", t
.value
41 t
.lexer
.lineno
+= t
.value
.count("\n")
44 print "Illegal character '%s'" % t
.value
[0]
54 ('left','PLUS','MINUS'),
55 ('left','TIMES','DIVIDE'),
62 def p_statement_assign(t
):
63 'statement : NAME EQUALS expression'
66 def p_statement_expr(t
):
67 'statement : expression'
70 def p_expression_binop(t
):
71 '''expression : expression PLUS expression
72 | expression MINUS expression
73 | expression TIMES expression
74 | expression DIVIDE expression'''
75 if t
[2] == '+' : t
[0] = t
[1] + t
[3]
76 elif t
[2] == '-': t
[0] = t
[1] - t
[3]
77 elif t
[2] == '*': t
[0] = t
[1] * t
[3]
78 elif t
[2] == '/': t
[0] = t
[1] / t
[3]
79 elif t
[2] == '<': t
[0] = t
[1] < t
[3]
81 def p_expression_uminus(t
):
82 'expression : MINUS expression %prec UMINUS'
85 def p_expression_group(t
):
86 'expression : LPAREN expression RPAREN'
89 def p_expression_number(t
):
93 def p_expression_name(t
):
98 print "Undefined name '%s'" % t
[1]
102 print "Syntax error at '%s'" % t
.value
104 import ply
.yacc
as yacc
105 yacc
.yacc(optimize
=1)
109 s
= raw_input('calc > ')