calc.py (4479:61d3ed46e373) calc.py (6498:e21e9ab5fad0)
1# -----------------------------------------------------------------------------
2# calc.py
3#
4# A simple calculator with variables. This is from O'Reilly's
5# "Lex and Yacc", p. 63.
6# -----------------------------------------------------------------------------
7
8import sys
9sys.path.insert(0,"../..")
10
1# -----------------------------------------------------------------------------
2# calc.py
3#
4# A simple calculator with variables. This is from O'Reilly's
5# "Lex and Yacc", p. 63.
6# -----------------------------------------------------------------------------
7
8import sys
9sys.path.insert(0,"../..")
10
11if sys.version_info[0] >= 3:
12 raw_input = input
13
11tokens = (
12 'NAME','NUMBER',
13 'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
14 'LPAREN','RPAREN',
15 )
16
17# Tokens
18

--- 6 unchanged lines hidden (view full) ---

25t_RPAREN = r'\)'
26t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
27
28def t_NUMBER(t):
29 r'\d+'
30 try:
31 t.value = int(t.value)
32 except ValueError:
14tokens = (
15 'NAME','NUMBER',
16 'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
17 'LPAREN','RPAREN',
18 )
19
20# Tokens
21

--- 6 unchanged lines hidden (view full) ---

28t_RPAREN = r'\)'
29t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
30
31def t_NUMBER(t):
32 r'\d+'
33 try:
34 t.value = int(t.value)
35 except ValueError:
33 print "Integer value too large", t.value
36 print("Integer value too large %s" % t.value)
34 t.value = 0
35 return t
36
37t_ignore = " \t"
38
39def t_newline(t):
40 r'\n+'
41 t.lexer.lineno += t.value.count("\n")
37 t.value = 0
38 return t
39
40t_ignore = " \t"
41
42def t_newline(t):
43 r'\n+'
44 t.lexer.lineno += t.value.count("\n")
42
45
43def t_error(t):
46def t_error(t):
44 print "Illegal character '%s'" % t.value[0]
47 print("Illegal character '%s'" % t.value[0])
45 t.lexer.skip(1)
48 t.lexer.skip(1)
46
49
47# Build the lexer
48import ply.lex as lex
49lex.lex(optimize=1)
50
51# Parsing rules
52
53precedence = (
54 ('left','PLUS','MINUS'),

--- 5 unchanged lines hidden (view full) ---

60names = { }
61
62def p_statement_assign(t):
63 'statement : NAME EQUALS expression'
64 names[t[1]] = t[3]
65
66def p_statement_expr(t):
67 'statement : expression'
50# Build the lexer
51import ply.lex as lex
52lex.lex(optimize=1)
53
54# Parsing rules
55
56precedence = (
57 ('left','PLUS','MINUS'),

--- 5 unchanged lines hidden (view full) ---

63names = { }
64
65def p_statement_assign(t):
66 'statement : NAME EQUALS expression'
67 names[t[1]] = t[3]
68
69def p_statement_expr(t):
70 'statement : expression'
68 print t[1]
71 print(t[1])
69
70def 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]

--- 13 unchanged lines hidden (view full) ---

90 'expression : NUMBER'
91 t[0] = t[1]
92
93def p_expression_name(t):
94 'expression : NAME'
95 try:
96 t[0] = names[t[1]]
97 except LookupError:
72
73def p_expression_binop(t):
74 '''expression : expression PLUS expression
75 | expression MINUS expression
76 | expression TIMES expression
77 | expression DIVIDE expression'''
78 if t[2] == '+' : t[0] = t[1] + t[3]
79 elif t[2] == '-': t[0] = t[1] - t[3]

--- 13 unchanged lines hidden (view full) ---

93 'expression : NUMBER'
94 t[0] = t[1]
95
96def p_expression_name(t):
97 'expression : NAME'
98 try:
99 t[0] = names[t[1]]
100 except LookupError:
98 print "Undefined name '%s'" % t[1]
101 print("Undefined name '%s'" % t[1])
99 t[0] = 0
100
101def p_error(t):
102 t[0] = 0
103
104def p_error(t):
102 print "Syntax error at '%s'" % t.value
105 if t:
106 print("Syntax error at '%s'" % t.value)
107 else:
108 print("Syntax error at EOF")
103
104import ply.yacc as yacc
105yacc.yacc(optimize=1)
106
107while 1:
108 try:
109 s = raw_input('calc > ')
110 except EOFError:
111 break
112 yacc.parse(s)
113
109
110import ply.yacc as yacc
111yacc.yacc(optimize=1)
112
113while 1:
114 try:
115 s = raw_input('calc > ')
116 except EOFError:
117 break
118 yacc.parse(s)
119