1*09948d41SKrzysztof Kosiński# ----------------------------------------------------------------------------- 2*09948d41SKrzysztof Kosiński# yacc_badid.py 3*09948d41SKrzysztof Kosiński# 4*09948d41SKrzysztof Kosiński# Attempt to define a rule with a bad-identifier name 5*09948d41SKrzysztof Kosiński# ----------------------------------------------------------------------------- 6*09948d41SKrzysztof Kosińskiimport sys 7*09948d41SKrzysztof Kosiński 8*09948d41SKrzysztof Kosińskiif ".." not in sys.path: sys.path.insert(0,"..") 9*09948d41SKrzysztof Kosińskiimport ply.yacc as yacc 10*09948d41SKrzysztof Kosiński 11*09948d41SKrzysztof Kosińskifrom calclex import tokens 12*09948d41SKrzysztof Kosiński 13*09948d41SKrzysztof Kosiński# Parsing rules 14*09948d41SKrzysztof Kosińskiprecedence = ( 15*09948d41SKrzysztof Kosiński ('left','PLUS','MINUS'), 16*09948d41SKrzysztof Kosiński ('left','TIMES','DIVIDE'), 17*09948d41SKrzysztof Kosiński ('right','UMINUS'), 18*09948d41SKrzysztof Kosiński ) 19*09948d41SKrzysztof Kosiński 20*09948d41SKrzysztof Kosiński# dictionary of names 21*09948d41SKrzysztof Kosińskinames = { } 22*09948d41SKrzysztof Kosiński 23*09948d41SKrzysztof Kosińskidef p_statement_assign(t): 24*09948d41SKrzysztof Kosiński 'statement : NAME EQUALS expression' 25*09948d41SKrzysztof Kosiński names[t[1]] = t[3] 26*09948d41SKrzysztof Kosiński 27*09948d41SKrzysztof Kosińskidef p_statement_expr(t): 28*09948d41SKrzysztof Kosiński 'statement : expression' 29*09948d41SKrzysztof Kosiński print(t[1]) 30*09948d41SKrzysztof Kosiński 31*09948d41SKrzysztof Kosińskidef p_statement_expr2(t): 32*09948d41SKrzysztof Kosiński 'statement : bad&rule' 33*09948d41SKrzysztof Kosiński pass 34*09948d41SKrzysztof Kosiński 35*09948d41SKrzysztof Kosińskidef p_badrule(t): 36*09948d41SKrzysztof Kosiński 'bad&rule : expression' 37*09948d41SKrzysztof Kosiński pass 38*09948d41SKrzysztof Kosiński 39*09948d41SKrzysztof Kosiński 40*09948d41SKrzysztof Kosińskidef p_expression_binop(t): 41*09948d41SKrzysztof Kosiński '''expression : expression PLUS expression 42*09948d41SKrzysztof Kosiński | expression MINUS expression 43*09948d41SKrzysztof Kosiński | expression TIMES expression 44*09948d41SKrzysztof Kosiński | expression DIVIDE expression''' 45*09948d41SKrzysztof Kosiński if t[2] == '+' : t[0] = t[1] + t[3] 46*09948d41SKrzysztof Kosiński elif t[2] == '-': t[0] = t[1] - t[3] 47*09948d41SKrzysztof Kosiński elif t[2] == '*': t[0] = t[1] * t[3] 48*09948d41SKrzysztof Kosiński elif t[2] == '/': t[0] = t[1] / t[3] 49*09948d41SKrzysztof Kosiński 50*09948d41SKrzysztof Kosińskidef p_expression_uminus(t): 51*09948d41SKrzysztof Kosiński 'expression : MINUS expression %prec UMINUS' 52*09948d41SKrzysztof Kosiński t[0] = -t[2] 53*09948d41SKrzysztof Kosiński 54*09948d41SKrzysztof Kosińskidef p_expression_group(t): 55*09948d41SKrzysztof Kosiński 'expression : LPAREN expression RPAREN' 56*09948d41SKrzysztof Kosiński t[0] = t[2] 57*09948d41SKrzysztof Kosiński 58*09948d41SKrzysztof Kosińskidef p_expression_number(t): 59*09948d41SKrzysztof Kosiński 'expression : NUMBER' 60*09948d41SKrzysztof Kosiński t[0] = t[1] 61*09948d41SKrzysztof Kosiński 62*09948d41SKrzysztof Kosińskidef p_expression_name(t): 63*09948d41SKrzysztof Kosiński 'expression : NAME' 64*09948d41SKrzysztof Kosiński try: 65*09948d41SKrzysztof Kosiński t[0] = names[t[1]] 66*09948d41SKrzysztof Kosiński except LookupError: 67*09948d41SKrzysztof Kosiński print("Undefined name '%s'" % t[1]) 68*09948d41SKrzysztof Kosiński t[0] = 0 69*09948d41SKrzysztof Kosiński 70*09948d41SKrzysztof Kosińskidef p_error(t): 71*09948d41SKrzysztof Kosiński pass 72*09948d41SKrzysztof Kosiński 73*09948d41SKrzysztof Kosińskiyacc.yacc() 74*09948d41SKrzysztof Kosiński 75*09948d41SKrzysztof Kosiński 76*09948d41SKrzysztof Kosiński 77*09948d41SKrzysztof Kosiński 78