yacc_badtok.py revision 4479
12632Sstever@eecs.umich.edu# ----------------------------------------------------------------------------- 22632Sstever@eecs.umich.edu# yacc_badtok.py 32632Sstever@eecs.umich.edu# 42632Sstever@eecs.umich.edu# A grammar, but tokens is a bad datatype 52632Sstever@eecs.umich.edu# ----------------------------------------------------------------------------- 62632Sstever@eecs.umich.edu 72632Sstever@eecs.umich.eduimport sys 82632Sstever@eecs.umich.edusys.tracebacklimit = 0 92632Sstever@eecs.umich.edu 104479Sbinkertn@umich.edusys.path.insert(0,"..") 114479Sbinkertn@umich.eduimport ply.yacc as yacc 124479Sbinkertn@umich.edu 132632Sstever@eecs.umich.edutokens = "Hello" 142632Sstever@eecs.umich.edu 152632Sstever@eecs.umich.edu# Parsing rules 162632Sstever@eecs.umich.eduprecedence = ( 172632Sstever@eecs.umich.edu ('left','PLUS','MINUS'), 182632Sstever@eecs.umich.edu ('left','TIMES','DIVIDE'), 192632Sstever@eecs.umich.edu ('right','UMINUS'), 202632Sstever@eecs.umich.edu ) 212632Sstever@eecs.umich.edu 222632Sstever@eecs.umich.edu# dictionary of names 232632Sstever@eecs.umich.edunames = { } 242632Sstever@eecs.umich.edu 252632Sstever@eecs.umich.edudef p_statement_assign(t): 262632Sstever@eecs.umich.edu 'statement : NAME EQUALS expression' 272632Sstever@eecs.umich.edu names[t[1]] = t[3] 282632Sstever@eecs.umich.edu 292632Sstever@eecs.umich.edudef p_statement_expr(t): 302632Sstever@eecs.umich.edu 'statement : expression' 312632Sstever@eecs.umich.edu print t[1] 322632Sstever@eecs.umich.edu 332632Sstever@eecs.umich.edudef p_expression_binop(t): 342632Sstever@eecs.umich.edu '''expression : expression PLUS expression 352632Sstever@eecs.umich.edu | expression MINUS expression 362632Sstever@eecs.umich.edu | expression TIMES expression 372632Sstever@eecs.umich.edu | expression DIVIDE expression''' 382632Sstever@eecs.umich.edu if t[2] == '+' : t[0] = t[1] + t[3] 392632Sstever@eecs.umich.edu elif t[2] == '-': t[0] = t[1] - t[3] 402632Sstever@eecs.umich.edu elif t[2] == '*': t[0] = t[1] * t[3] 412632Sstever@eecs.umich.edu elif t[3] == '/': t[0] = t[1] / t[3] 422632Sstever@eecs.umich.edu 432632Sstever@eecs.umich.edudef p_expression_uminus(t): 442632Sstever@eecs.umich.edu 'expression : MINUS expression %prec UMINUS' 452632Sstever@eecs.umich.edu t[0] = -t[2] 462632Sstever@eecs.umich.edu 472632Sstever@eecs.umich.edudef p_expression_group(t): 482632Sstever@eecs.umich.edu 'expression : LPAREN expression RPAREN' 492632Sstever@eecs.umich.edu t[0] = t[2] 502632Sstever@eecs.umich.edu 512632Sstever@eecs.umich.edudef p_expression_number(t): 522632Sstever@eecs.umich.edu 'expression : NUMBER' 532632Sstever@eecs.umich.edu t[0] = t[1] 542632Sstever@eecs.umich.edu 552632Sstever@eecs.umich.edudef p_expression_name(t): 562632Sstever@eecs.umich.edu 'expression : NAME' 572632Sstever@eecs.umich.edu try: 582632Sstever@eecs.umich.edu t[0] = names[t[1]] 592632Sstever@eecs.umich.edu except LookupError: 602632Sstever@eecs.umich.edu print "Undefined name '%s'" % t[1] 612632Sstever@eecs.umich.edu t[0] = 0 622632Sstever@eecs.umich.edu 632632Sstever@eecs.umich.edudef p_error(t): 642632Sstever@eecs.umich.edu print "Syntax error at '%s'" % t.value 652632Sstever@eecs.umich.edu 662632Sstever@eecs.umich.eduyacc.yacc() 672632Sstever@eecs.umich.edu 682632Sstever@eecs.umich.edu 692632Sstever@eecs.umich.edu 702632Sstever@eecs.umich.edu 71