3 from ply import lex, yacc
7 tokens = ('OP_WORD', 'NAME', 'AND_OP', 'OR_OP', 'NOT_OP', 'SP1')
9 t_OP_WORD = '(AND|and|OR|or|NOT|not)'
11 t_NAME = '([a-z][a-z0-9_]*)'
22 """Avoid warnings on stderr"""
26 def p_expression_name(p):
27 """expression : NAME"""
30 def p_expression_and_and(p):
31 """expression : expression SP0 AND_OP AND_OP SP0 expression"""
32 p[0] = ('AND', p[1], p[6])
34 def p_expression_and(p):
35 """expression : expression SP0 AND_OP SP0 expression"""
36 p[0] = ('AND', p[1], p[5])
38 def p_expression_op_word(p):
39 """expression : l_expression op_word r_expression"""
40 if p[2] in ('AND', 'and'):
41 p[0] = ('AND', p[1], p[3])
42 elif p[2] in ('OR', 'or'):
43 p[0] = ('OR', p[1], p[3])
47 def p_expression_or_or(p):
48 """expression : expression SP0 OR_OP OR_OP SP0 expression"""
49 p[0] = ('OR', p[1], p[6])
51 def p_expression_or(p):
52 """expression : expression SP0 OR_OP SP0 expression"""
53 p[0] = ('OR', p[1], p[5])
55 def p_expression_not(p):
56 """expression : NOT_OP SP0 expression"""
59 def p_expression_not_word(p):
60 """expression : op_word r_expression"""
61 if p[1] in ('NOT', 'not'):
66 def p_expression_in_parens(p):
67 """expression : expression_parens"""
70 def p_l_expression(p):
71 """l_expression : expression_parens
81 def p_r_expression(p):
82 """r_expression : expression_parens
92 def p_expression_parens(p):
93 """expression_parens : '(' SP0 expression SP0 ')'"""
94 p[0] = ('PARENS', p[3])
97 """op_word : OP_WORD"""
98 if p[1] in ('AND', 'and', 'OR', 'or', 'NOT', 'not'):
112 """Avoid warnings on stderr"""