3 from ply import lex, yacc
7 tokens = ('NAME', 'AND_OP', 'OR_OP', 'NOT_OP', 'SP1')
9 t_NAME = '[a-z][a-z0-9_]*'
20 """Avoid warnings on stderr"""
24 def p_expression_name(p):
25 """expression : NAME"""
28 def p_expression_and_and(p):
29 """expression : expression SP0 AND_OP AND_OP SP0 expression"""
30 p[0] = ('AND', p[1], p[6])
32 def p_expression_and(p):
33 """expression : expression SP0 AND_OP SP0 expression"""
34 p[0] = ('AND', p[1], p[5])
36 def p_expression_and_word(p):
37 """expression : l_expression and_word r_expression"""
38 p[0] = ('AND', p[1], p[3])
40 def p_expression_not(p):
41 """expression : NOT_OP SP0 expression"""
44 def p_expression_or_or(p):
45 """expression : expression SP0 OR_OP OR_OP SP0 expression"""
46 p[0] = ('OR', p[1], p[6])
48 def p_expression_or(p):
49 """expression : expression SP0 OR_OP SP0 expression"""
50 p[0] = ('OR', p[1], p[5])
52 def p_expression_in_parens(p):
53 """expression : expression_parens"""
56 def p_l_expression(p):
57 """l_expression : expression_parens
67 def p_r_expression(p):
68 """r_expression : expression_parens
78 def p_expression_parens(p):
79 """expression_parens : '(' SP0 expression SP0 ')'"""
80 p[0] = ('PARENS', p[3])
84 if p[1] in ('AND', 'and'):
98 """Avoid warnings on stderr"""