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