SP1 : '[ \t]+'
expression : NAME
- | expression AND_OP AND_OP expression
- | expression AND_OP expression
- | expression OR_OP OR_OP expression
- | expression OR_OP expression
- | NOT_OP expression
- | '(' expression ')'
+ | expression SP0 AND_OP AND_OP SP0 expression
+ | expression SP0 AND_OP SP0 expression
+ | NOT_OP SP0 expression
+ | expression SP0 OR_OP OR_OP SP0 expression
+ | expression SP0 OR_OP SP0 expression
+ | '(' SP0 expression SP0 ')'
+
+SP0 : SP1 | empty
+
+empty :
literals = '()'
-tokens = ('NAME', 'AND_OP', 'OR_OP', 'NOT_OP')
+tokens = ('NAME', 'AND_OP', 'OR_OP', 'NOT_OP', 'SP1')
t_NAME = '[a-z][a-z0-9_]*'
t_NOT_OP = '!'
-t_ignore = '[ \t]+'
+t_SP1 = '[ \t]+'
def t_error(t):
"""Avoid warnings on stderr"""
p[0] = ('NAME', p[1])
def p_expression_and_and(p):
- """expression : expression AND_OP AND_OP expression"""
- p[0] = ('AND', p[1], p[4])
+ """expression : expression SP0 AND_OP AND_OP SP0 expression"""
+ p[0] = ('AND', p[1], p[6])
def p_expression_and(p):
- """expression : expression AND_OP expression"""
- p[0] = ('AND', p[1], p[3])
+ """expression : expression SP0 AND_OP SP0 expression"""
+ p[0] = ('AND', p[1], p[5])
def p_expression_not(p):
- """expression : NOT_OP expression"""
- p[0] = ('NOT', p[2])
+ """expression : NOT_OP SP0 expression"""
+ p[0] = ('NOT', p[3])
def p_expression_or_or(p):
- """expression : expression OR_OP OR_OP expression"""
- p[0] = ('OR', p[1], p[4])
+ """expression : expression SP0 OR_OP OR_OP SP0 expression"""
+ p[0] = ('OR', p[1], p[6])
def p_expression_or(p):
- """expression : expression OR_OP expression"""
- p[0] = ('OR', p[1], p[3])
+ """expression : expression SP0 OR_OP SP0 expression"""
+ p[0] = ('OR', p[1], p[5])
def p_expression_parens(p):
- """expression : '(' expression ')'"""
- p[0] = ('PARENS', p[2])
+ """expression : '(' SP0 expression SP0 ')'"""
+ p[0] = ('PARENS', p[3])
+
+def p_SP0(p):
+ """SP0 : SP1
+ | empty
+ """
+
+def p_empty(p):
+ """empty : """
def p_error(p):
"""Avoid warnings on stderr"""
self.assertEqual(parser.parse('!xxx&yyy&zzz|ooo'),
('OR', ('AND', ('AND', ('NOT', ('NAME', 'xxx')), ('NAME', 'yyy')), ('NAME', 'zzz')), ('NAME', 'ooo'))
)
- self.assertEqual(parser.parse('!(xxx && yyy)'),
+ self.assertEqual(parser.parse('!(xxx && yyy)'),
('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
)
self.assertEqual(parser.parse('!(xxx || yyy)'),