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