X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=parser%2Fparser.py;h=d278e4b210681817be55a9624083d3b7d62747a7;hb=02dbb2a7f4d0804c56122cc7ca681224fe659abc;hp=0af77f65f2e99054ff568226658e66b8e4d7608b;hpb=fc9a4ef6e9dcde7e48ca54609ba7c9e80a1f20a7;p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git diff --git a/parser/parser.py b/parser/parser.py index 0af77f6..d278e4b 100644 --- a/parser/parser.py +++ b/parser/parser.py @@ -33,6 +33,10 @@ def p_expression_and(p): """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]) @@ -45,17 +49,50 @@ def p_expression_or(p): """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"""