yacc_rr.py revision 4479:61d3ed46e373
15222Sksewell@umich.edu# ----------------------------------------------------------------------------- 25268Sksewell@umich.edu# yacc_rr.py 35254Sksewell@umich.edu# 45222Sksewell@umich.edu# A grammar with a reduce/reduce conflict 55254Sksewell@umich.edu# ----------------------------------------------------------------------------- 65254Sksewell@umich.eduimport sys 75254Sksewell@umich.edusys.tracebacklimit = 0 85254Sksewell@umich.edu 95254Sksewell@umich.edusys.path.insert(0,"..") 105254Sksewell@umich.eduimport ply.yacc as yacc 115254Sksewell@umich.edu 125254Sksewell@umich.edufrom calclex import tokens 135254Sksewell@umich.edu 145254Sksewell@umich.edu# Parsing rules 155222Sksewell@umich.eduprecedence = ( 165254Sksewell@umich.edu ('left','PLUS','MINUS'), 175254Sksewell@umich.edu ('left','TIMES','DIVIDE'), 185254Sksewell@umich.edu ('right','UMINUS'), 195254Sksewell@umich.edu ) 205254Sksewell@umich.edu 215254Sksewell@umich.edu# dictionary of names 225254Sksewell@umich.edunames = { } 235254Sksewell@umich.edu 245254Sksewell@umich.edudef p_statement_assign(t): 255254Sksewell@umich.edu 'statement : NAME EQUALS expression' 265254Sksewell@umich.edu names[t[1]] = t[3] 275222Sksewell@umich.edu 285254Sksewell@umich.edudef p_statement_assign_2(t): 295254Sksewell@umich.edu 'statement : NAME EQUALS NUMBER' 305254Sksewell@umich.edu names[t[1]] = t[3] 315222Sksewell@umich.edu 325222Sksewell@umich.edudef p_statement_expr(t): 335222Sksewell@umich.edu 'statement : expression' 345222Sksewell@umich.edu print t[1] 355222Sksewell@umich.edu 365222Sksewell@umich.edudef p_expression_binop(t): 375222Sksewell@umich.edu '''expression : expression PLUS expression 385222Sksewell@umich.edu | expression MINUS expression 395222Sksewell@umich.edu | expression TIMES expression 405222Sksewell@umich.edu | expression DIVIDE expression''' 415222Sksewell@umich.edu if t[2] == '+' : t[0] = t[1] + t[3] 425222Sksewell@umich.edu elif t[2] == '-': t[0] = t[1] - t[3] 435222Sksewell@umich.edu elif t[2] == '*': t[0] = t[1] * t[3] 448229Snate@binkert.org elif t[3] == '/': t[0] = t[1] / t[3] 455222Sksewell@umich.edu 468229Snate@binkert.orgdef p_expression_uminus(t): 475222Sksewell@umich.edu 'expression : MINUS expression %prec UMINUS' 488229Snate@binkert.org t[0] = -t[2] 495222Sksewell@umich.edu 505222Sksewell@umich.edudef p_expression_group(t): 518229Snate@binkert.org 'expression : LPAREN expression RPAREN' 525222Sksewell@umich.edu t[0] = t[2] 535222Sksewell@umich.edu 545222Sksewell@umich.edudef p_expression_number(t): 555222Sksewell@umich.edu 'expression : NUMBER' 565222Sksewell@umich.edu t[0] = t[1] 575222Sksewell@umich.edu 585222Sksewell@umich.edudef p_expression_name(t): 595222Sksewell@umich.edu 'expression : NAME' 605222Sksewell@umich.edu try: 615222Sksewell@umich.edu t[0] = names[t[1]] 625222Sksewell@umich.edu except LookupError: 635222Sksewell@umich.edu print "Undefined name '%s'" % t[1] 645222Sksewell@umich.edu t[0] = 0 655222Sksewell@umich.edu 665222Sksewell@umich.edudef p_error(t): 675222Sksewell@umich.edu print "Syntax error at '%s'" % t.value 685222Sksewell@umich.edu 695222Sksewell@umich.eduyacc.yacc() 705222Sksewell@umich.edu 715222Sksewell@umich.edu 725222Sksewell@umich.edu 735222Sksewell@umich.edu 745222Sksewell@umich.edu