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