yacc_rr.py (4479:61d3ed46e373) | yacc_rr.py (6498:e21e9ab5fad0) |
---|---|
1# ----------------------------------------------------------------------------- 2# yacc_rr.py 3# 4# A grammar with a reduce/reduce conflict 5# ----------------------------------------------------------------------------- 6import sys | 1# ----------------------------------------------------------------------------- 2# yacc_rr.py 3# 4# A grammar with a reduce/reduce conflict 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 15precedence = ( 16 ('left','PLUS','MINUS'), 17 ('left','TIMES','DIVIDE'), --- 8 unchanged lines hidden (view full) --- 26 names[t[1]] = t[3] 27 28def p_statement_assign_2(t): 29 'statement : NAME EQUALS NUMBER' 30 names[t[1]] = t[3] 31 32def p_statement_expr(t): 33 'statement : expression' | 9import ply.yacc as yacc 10 11from calclex import tokens 12 13# Parsing rules 14precedence = ( 15 ('left','PLUS','MINUS'), 16 ('left','TIMES','DIVIDE'), --- 8 unchanged lines hidden (view full) --- 25 names[t[1]] = t[3] 26 27def p_statement_assign_2(t): 28 'statement : NAME EQUALS NUMBER' 29 names[t[1]] = t[3] 30 31def p_statement_expr(t): 32 'statement : expression' |
34 print t[1] | 33 print(t[1]) |
35 36def p_expression_binop(t): 37 '''expression : expression PLUS expression 38 | expression MINUS expression 39 | expression TIMES expression 40 | expression DIVIDE expression''' 41 if t[2] == '+' : t[0] = t[1] + t[3] 42 elif t[2] == '-': t[0] = t[1] - t[3] 43 elif t[2] == '*': t[0] = t[1] * t[3] | 34 35def p_expression_binop(t): 36 '''expression : expression PLUS expression 37 | expression MINUS expression 38 | expression TIMES expression 39 | expression DIVIDE expression''' 40 if t[2] == '+' : t[0] = t[1] + t[3] 41 elif t[2] == '-': t[0] = t[1] - t[3] 42 elif t[2] == '*': t[0] = t[1] * t[3] |
44 elif t[3] == '/': t[0] = t[1] / t[3] | 43 elif t[2] == '/': t[0] = t[1] / t[3] |
45 46def p_expression_uminus(t): 47 'expression : MINUS expression %prec UMINUS' 48 t[0] = -t[2] 49 50def p_expression_group(t): 51 'expression : LPAREN expression RPAREN' 52 t[0] = t[2] 53 54def p_expression_number(t): 55 'expression : NUMBER' 56 t[0] = t[1] 57 58def p_expression_name(t): 59 'expression : NAME' 60 try: 61 t[0] = names[t[1]] 62 except LookupError: | 44 45def p_expression_uminus(t): 46 'expression : MINUS expression %prec UMINUS' 47 t[0] = -t[2] 48 49def p_expression_group(t): 50 'expression : LPAREN expression RPAREN' 51 t[0] = t[2] 52 53def p_expression_number(t): 54 'expression : NUMBER' 55 t[0] = t[1] 56 57def p_expression_name(t): 58 'expression : NAME' 59 try: 60 t[0] = names[t[1]] 61 except LookupError: |
63 print "Undefined name '%s'" % t[1] | 62 print("Undefined name '%s'" % t[1]) |
64 t[0] = 0 65 66def p_error(t): | 63 t[0] = 0 64 65def p_error(t): |
67 print "Syntax error at '%s'" % t.value | 66 print("Syntax error at '%s'" % t.value) |
68 69yacc.yacc() 70 71 72 73 | 67 68yacc.yacc() 69 70 71 72 |