yacc_sr.py (4479:61d3ed46e373) yacc_sr.py (6498:e21e9ab5fad0)
1# -----------------------------------------------------------------------------
2# yacc_sr.py
3#
4# A grammar with shift-reduce conflicts
5# -----------------------------------------------------------------------------
6import sys
1# -----------------------------------------------------------------------------
2# yacc_sr.py
3#
4# A grammar with shift-reduce conflicts
5# -----------------------------------------------------------------------------
6import sys
7sys.tracebacklimit = 0
8
7
9sys.path.insert(0,"..")
8if ".." not in sys.path: sys.path.insert(0,"..")
10import ply.yacc as yacc
11
12from calclex import tokens
13
14# Parsing rules
15
16# dictionary of names
17names = { }
18
19def p_statement_assign(t):
20 'statement : NAME EQUALS expression'
21 names[t[1]] = t[3]
22
23def p_statement_expr(t):
24 'statement : expression'
9import ply.yacc as yacc
10
11from calclex import tokens
12
13# Parsing rules
14
15# dictionary of names
16names = { }
17
18def p_statement_assign(t):
19 'statement : NAME EQUALS expression'
20 names[t[1]] = t[3]
21
22def p_statement_expr(t):
23 'statement : expression'
25 print t[1]
24 print(t[1])
26
27def p_expression_binop(t):
28 '''expression : expression PLUS expression
29 | expression MINUS expression
30 | expression TIMES expression
31 | expression DIVIDE expression'''
32 if t[2] == '+' : t[0] = t[1] + t[3]
33 elif t[2] == '-': t[0] = t[1] - t[3]
34 elif t[2] == '*': t[0] = t[1] * t[3]
25
26def p_expression_binop(t):
27 '''expression : expression PLUS expression
28 | expression MINUS expression
29 | expression TIMES expression
30 | expression DIVIDE expression'''
31 if t[2] == '+' : t[0] = t[1] + t[3]
32 elif t[2] == '-': t[0] = t[1] - t[3]
33 elif t[2] == '*': t[0] = t[1] * t[3]
35 elif t[3] == '/': t[0] = t[1] / t[3]
34 elif t[2] == '/': t[0] = t[1] / t[3]
36
37def p_expression_uminus(t):
38 'expression : MINUS expression'
39 t[0] = -t[2]
40
41def p_expression_group(t):
42 'expression : LPAREN expression RPAREN'
43 t[0] = t[2]
44
45def p_expression_number(t):
46 'expression : NUMBER'
47 t[0] = t[1]
48
49def p_expression_name(t):
50 'expression : NAME'
51 try:
52 t[0] = names[t[1]]
53 except LookupError:
35
36def p_expression_uminus(t):
37 'expression : MINUS expression'
38 t[0] = -t[2]
39
40def p_expression_group(t):
41 'expression : LPAREN expression RPAREN'
42 t[0] = t[2]
43
44def p_expression_number(t):
45 'expression : NUMBER'
46 t[0] = t[1]
47
48def p_expression_name(t):
49 'expression : NAME'
50 try:
51 t[0] = names[t[1]]
52 except LookupError:
54 print "Undefined name '%s'" % t[1]
53 print("Undefined name '%s'" % t[1])
55 t[0] = 0
56
57def p_error(t):
54 t[0] = 0
55
56def p_error(t):
58 print "Syntax error at '%s'" % t.value
57 print("Syntax error at '%s'" % t.value)
59
60yacc.yacc()
61
62
63
64
58
59yacc.yacc()
60
61
62
63