1583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# ----------------------------------------------------------------------------- 2583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# yacc_nop.py 3583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# 4583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# Possible grammar rule defined without p_ prefix 5583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# ----------------------------------------------------------------------------- 6583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataimport sys 7583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 8583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataif ".." not in sys.path: sys.path.insert(0,"..") 9583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataimport ply.yacc as yacc 10583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 11583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatafrom calclex import tokens 12583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 13583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# Parsing rules 14583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataprecedence = ( 15583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata ('left','PLUS','MINUS'), 16583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata ('left','TIMES','DIVIDE'), 17583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata ('right','UMINUS'), 18583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata ) 19583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 20583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# dictionary of names 21583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatanames = { } 22583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 23583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_statement_assign(t): 24583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 'statement : NAME EQUALS expression' 25583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata names[t[1]] = t[3] 26583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 27583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef statement_expr(t): 28583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 'statement : expression' 29583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata print(t[1]) 30583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 31583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_expression_binop(t): 32583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata '''expression : expression PLUS expression 33583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata | expression MINUS expression 34583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata | expression TIMES expression 35583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata | expression DIVIDE expression''' 36583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata if t[2] == '+' : t[0] = t[1] + t[3] 37583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata elif t[2] == '-': t[0] = t[1] - t[3] 38583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata elif t[2] == '*': t[0] = t[1] * t[3] 39583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata elif t[2] == '/': t[0] = t[1] / t[3] 40583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 41583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_expression_uminus(t): 42583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 'expression : MINUS expression %prec UMINUS' 43583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata t[0] = -t[2] 44583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 45583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_expression_group(t): 46583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 'expression : LPAREN expression RPAREN' 47583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata t[0] = t[2] 48583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 49583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_expression_number(t): 50583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 'expression : NUMBER' 51583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata t[0] = t[1] 52583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 53583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_expression_name(t): 54583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 'expression : NAME' 55583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata try: 56583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata t[0] = names[t[1]] 57583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata except LookupError: 58583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata print("Undefined name '%s'" % t[1]) 59583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata t[0] = 0 60583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 61583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatadef p_error(t): 62583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata print("Syntax error at '%s'" % t.value) 63583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 64583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatayacc.yacc() 65583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 66583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 67583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 68583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata 69