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