1583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# -----------------------------------------------------------------------------
2583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# yacc_badtok.py
3583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata#
4583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# A grammar, but tokens is a bad datatype
5583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata# -----------------------------------------------------------------------------
6583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata
7583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataimport sys
8583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataif ".." not in sys.path: sys.path.insert(0,"..")
9583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granataimport ply.yacc as yacc
10583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granata
11583d33c593896afeb8486a25fabfcf6e9dc9ca75Enrico Granatatokens = "Hello"
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 p_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