X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=parser%2Fparser.py;fp=parser%2Fparser.py;h=0af77f65f2e99054ff568226658e66b8e4d7608b;hb=fc9a4ef6e9dcde7e48ca54609ba7c9e80a1f20a7;hp=1fb9903c62ee93794a22925678df963c728d4f2c;hpb=39c76ea424261b4abf153916f48eef13315e0e83;p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git diff --git a/parser/parser.py b/parser/parser.py index 1fb9903..0af77f6 100644 --- a/parser/parser.py +++ b/parser/parser.py @@ -4,7 +4,7 @@ from ply import lex, yacc 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_]*' @@ -14,7 +14,7 @@ t_OR_OP = r'\|' t_NOT_OP = '!' -t_ignore = '[ \t]+' +t_SP1 = '[ \t]+' def t_error(t): """Avoid warnings on stderr""" @@ -26,28 +26,36 @@ def p_expression_name(p): 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"""