xref: /aosp_15_r20/external/ply/ply/test/yacc_badid.py (revision 09948d41d6b3b06d4f51351d12c4c470db0bfb8f)
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