yacc_badprec2.py revision 6498
19651SAndreas.Sandberg@ARM.com# ----------------------------------------------------------------------------- 212284Sjose.marinho@arm.com# yacc_badprec2.py 39651SAndreas.Sandberg@ARM.com# 49651SAndreas.Sandberg@ARM.com# Bad precedence 59651SAndreas.Sandberg@ARM.com# ----------------------------------------------------------------------------- 69651SAndreas.Sandberg@ARM.comimport sys 79651SAndreas.Sandberg@ARM.com 89651SAndreas.Sandberg@ARM.comif ".." not in sys.path: sys.path.insert(0,"..") 99651SAndreas.Sandberg@ARM.comimport ply.yacc as yacc 109651SAndreas.Sandberg@ARM.com 119651SAndreas.Sandberg@ARM.comfrom calclex import tokens 129651SAndreas.Sandberg@ARM.com 139651SAndreas.Sandberg@ARM.com# Parsing rules 149651SAndreas.Sandberg@ARM.comprecedence = ( 159651SAndreas.Sandberg@ARM.com 42, 169651SAndreas.Sandberg@ARM.com ('left','TIMES','DIVIDE'), 179651SAndreas.Sandberg@ARM.com ('right','UMINUS'), 189651SAndreas.Sandberg@ARM.com ) 199651SAndreas.Sandberg@ARM.com 209651SAndreas.Sandberg@ARM.com# dictionary of names 219651SAndreas.Sandberg@ARM.comnames = { } 229651SAndreas.Sandberg@ARM.com 239651SAndreas.Sandberg@ARM.comdef p_statement_assign(t): 249651SAndreas.Sandberg@ARM.com 'statement : NAME EQUALS expression' 259651SAndreas.Sandberg@ARM.com names[t[1]] = t[3] 269651SAndreas.Sandberg@ARM.com 279651SAndreas.Sandberg@ARM.comdef p_statement_expr(t): 289651SAndreas.Sandberg@ARM.com 'statement : expression' 299651SAndreas.Sandberg@ARM.com print(t[1]) 309651SAndreas.Sandberg@ARM.com 319651SAndreas.Sandberg@ARM.comdef p_expression_binop(t): 329651SAndreas.Sandberg@ARM.com '''expression : expression PLUS expression 339651SAndreas.Sandberg@ARM.com | expression MINUS expression 349651SAndreas.Sandberg@ARM.com | expression TIMES expression 359651SAndreas.Sandberg@ARM.com | expression DIVIDE expression''' 369651SAndreas.Sandberg@ARM.com if t[2] == '+' : t[0] = t[1] + t[3] 379651SAndreas.Sandberg@ARM.com elif t[2] == '-': t[0] = t[1] - t[3] 389651SAndreas.Sandberg@ARM.com elif t[2] == '*': t[0] = t[1] * t[3] 399651SAndreas.Sandberg@ARM.com elif t[2] == '/': t[0] = t[1] / t[3] 4011793Sbrandon.potter@amd.com 4111793Sbrandon.potter@amd.comdef p_expression_uminus(t): 429651SAndreas.Sandberg@ARM.com 'expression : MINUS expression %prec UMINUS' 439651SAndreas.Sandberg@ARM.com t[0] = -t[2] 449651SAndreas.Sandberg@ARM.com 459651SAndreas.Sandberg@ARM.comdef p_expression_group(t): 469651SAndreas.Sandberg@ARM.com 'expression : LPAREN expression RPAREN' 479651SAndreas.Sandberg@ARM.com t[0] = t[2] 489651SAndreas.Sandberg@ARM.com 499651SAndreas.Sandberg@ARM.comdef p_expression_number(t): 509651SAndreas.Sandberg@ARM.com 'expression : NUMBER' 519760Sandreas@sandberg.pp.se t[0] = t[1] 529651SAndreas.Sandberg@ARM.com 539683Sandreas@sandberg.pp.sedef p_expression_name(t): 549753Sandreas@sandberg.pp.se 'expression : NAME' 559651SAndreas.Sandberg@ARM.com try: 569651SAndreas.Sandberg@ARM.com t[0] = names[t[1]] 579651SAndreas.Sandberg@ARM.com except LookupError: 589651SAndreas.Sandberg@ARM.com print("Undefined name '%s'" % t[1]) 599651SAndreas.Sandberg@ARM.com t[0] = 0 609651SAndreas.Sandberg@ARM.com 619651SAndreas.Sandberg@ARM.comdef p_error(t): 629651SAndreas.Sandberg@ARM.com print("Syntax error at '%s'" % t.value) 639651SAndreas.Sandberg@ARM.com 649651SAndreas.Sandberg@ARM.comyacc.yacc() 659651SAndreas.Sandberg@ARM.com 669651SAndreas.Sandberg@ARM.com 6711839SCurtis.Dunham@arm.com 689651SAndreas.Sandberg@ARM.com 699651SAndreas.Sandberg@ARM.com