"""expression : expression SP0 AND_OP SP0 expression"""
p[0] = ('AND', p[1], p[5])
+def p_expression_and_word(p):
+ """expression : l_expression and_word r_expression"""
+ p[0] = ('AND', p[1], p[3])
+
def p_expression_not(p):
"""expression : NOT_OP SP0 expression"""
p[0] = ('NOT', p[3])
"""expression : expression SP0 OR_OP SP0 expression"""
p[0] = ('OR', p[1], p[5])
+def p_expression_in_parens(p):
+ """expression : expression_parens"""
+ p[0] = p[1]
+
+def p_l_expression(p):
+ """l_expression : expression_parens
+ | expression SP1
+ """
+ if len(p) == 2:
+ p[0] = p[1]
+ elif len(p) == 3:
+ p[0] = p[1]
+ else:
+ raise ValueError(p)
+
+def p_r_expression(p):
+ """r_expression : expression_parens
+ | SP1 expression
+ """
+ if len(p) == 2:
+ p[0] = p[1]
+ elif len(p) == 3:
+ p[0] = p[2]
+ else:
+ raise ValueError(p)
+
def p_expression_parens(p):
- """expression : '(' SP0 expression SP0 ')'"""
+ """expression_parens : '(' SP0 expression SP0 ')'"""
p[0] = ('PARENS', p[3])
+def p_and_word(p):
+ """and_word : NAME"""
+ if p[1] in ('AND', 'and'):
+ p[0] = p[1]
+ else:
+ raise SyntaxError
+
def p_SP0(p):
"""SP0 : SP1
| empty
"""
def p_empty(p):
- """empty : """
+ """empty :"""
def p_error(p):
"""Avoid warnings on stderr"""