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