1*09948d41SKrzysztof Kosiński# ----------------------------------------------------------------------------- 2*09948d41SKrzysztof Kosiński# yacc_literal.py 3*09948d41SKrzysztof Kosiński# 4*09948d41SKrzysztof Kosiński# Grammar with bad literal characters 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','+','-'), 16*09948d41SKrzysztof Kosiński ('left','*','/'), 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_expression_binop(t): 32*09948d41SKrzysztof Kosiński '''expression : expression '+' expression 33*09948d41SKrzysztof Kosiński | expression '-' expression 34*09948d41SKrzysztof Kosiński | expression '*' expression 35*09948d41SKrzysztof Kosiński | expression '/' expression 36*09948d41SKrzysztof Kosiński | expression '**' expression ''' 37*09948d41SKrzysztof Kosiński if t[2] == '+' : t[0] = t[1] + t[3] 38*09948d41SKrzysztof Kosiński elif t[2] == '-': t[0] = t[1] - t[3] 39*09948d41SKrzysztof Kosiński elif t[2] == '*': t[0] = t[1] * t[3] 40*09948d41SKrzysztof Kosiński elif t[2] == '/': t[0] = t[1] / t[3] 41*09948d41SKrzysztof Kosiński 42*09948d41SKrzysztof Kosińskidef p_expression_uminus(t): 43*09948d41SKrzysztof Kosiński 'expression : MINUS expression %prec UMINUS' 44*09948d41SKrzysztof Kosiński t[0] = -t[2] 45*09948d41SKrzysztof Kosiński 46*09948d41SKrzysztof Kosińskidef p_expression_group(t): 47*09948d41SKrzysztof Kosiński 'expression : LPAREN expression RPAREN' 48*09948d41SKrzysztof Kosiński t[0] = t[2] 49*09948d41SKrzysztof Kosiński 50*09948d41SKrzysztof Kosińskidef p_expression_number(t): 51*09948d41SKrzysztof Kosiński 'expression : NUMBER' 52*09948d41SKrzysztof Kosiński t[0] = t[1] 53*09948d41SKrzysztof Kosiński 54*09948d41SKrzysztof Kosińskidef p_expression_name(t): 55*09948d41SKrzysztof Kosiński 'expression : NAME' 56*09948d41SKrzysztof Kosiński try: 57*09948d41SKrzysztof Kosiński t[0] = names[t[1]] 58*09948d41SKrzysztof Kosiński except LookupError: 59*09948d41SKrzysztof Kosiński print("Undefined name '%s'" % t[1]) 60*09948d41SKrzysztof Kosiński t[0] = 0 61*09948d41SKrzysztof Kosiński 62*09948d41SKrzysztof Kosińskidef p_error(t): 63*09948d41SKrzysztof Kosiński print("Syntax error at '%s'" % t.value) 64*09948d41SKrzysztof Kosiński 65*09948d41SKrzysztof Kosińskiyacc.yacc() 66*09948d41SKrzysztof Kosiński 67*09948d41SKrzysztof Kosiński 68*09948d41SKrzysztof Kosiński 69*09948d41SKrzysztof Kosiński 70