-def t_error(t):
- """Avoid warnings on stderr"""
-
-lexer = lex.lex()
-
-def p_expression_name(p):
- """expression : NAME"""
- p[0] = ('NAME', p[1])
-
-def p_expression_and_and(p):
- """expression : expression SP0 AND_OP AND_OP SP0 expression"""
- p[0] = ('AND', p[1], p[6])
-
-def p_expression_and(p):
- """expression : expression SP0 AND_OP SP0 expression"""
- p[0] = ('AND', p[1], p[5])
-
-def p_expression_op_word(p):
- """expression : l_expression op_word r_expression"""
- if p[2] in ('AND', 'and'):
- p[0] = ('AND', p[1], p[3])
- elif p[2] in ('OR', 'or'):
- p[0] = ('OR', p[1], p[3])
-
-def p_expression_or_or(p):
- """expression : expression SP0 OR_OP OR_OP SP0 expression"""
- p[0] = ('OR', p[1], p[6])
-
-def p_expression_or(p):
- """expression : expression SP0 OR_OP SP0 expression"""
- p[0] = ('OR', p[1], p[5])
-
-def p_expression_not(p):
- """expression : NOT_OP SP0 expression"""
- p[0] = ('NOT', p[3])
-
-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_parens : '(' SP0 expression SP0 ')'"""
- p[0] = ('PARENS', p[3])
-
-def p_op_word(p):
- """op_word : NAME"""
- if p[1] in ('AND', 'and', 'OR', 'or'):
- p[0] = p[1]
- else:
- raise SyntaxError
-
-def p_SP0(p):
- """SP0 : SP1
- | empty
- """
-
-def p_empty(p):
- """empty :"""
-
-def p_error(p):
- """Avoid warnings on stderr"""
- yacc.restart()
-
-precedence = (
- ('left', 'OR_OP'),
- ('left', 'AND_OP'),
- ('right', 'NOT_OP'),
-)
-
-parser = yacc.yacc()