X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=parse_query.py;h=c74eb78d21a29a5d33ec85af523ed85266b41796;hb=fa07ba5f0028c36e849f99eae9294eaa7a438945;hp=4533413f783bd163efca15393822c4d38172cb0a;hpb=1e45627b8f4f6074fd4d0df8379db1d8fa7f6b26;p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git diff --git a/parse_query.py b/parse_query.py index 4533413..c74eb78 100644 --- a/parse_query.py +++ b/parse_query.py @@ -18,3 +18,35 @@ 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(p): + """expression : expression AND_OP expression""" + p[0] = ('AND', p[1], p[3]) + +def p_expression_not(p): + """expression : NOT_OP expression""" + p[0] = ('NOT', p[2]) + +def p_expression_or(p): + """expression : expression OR_OP expression""" + p[0] = ('OR', p[1], p[3]) + +def p_expression_parens(p): + """expression : '(' expression ')'""" + p[0] = ('PARENS', p[2]) + +def p_error(p): + """Avoid warnings on stderr""" + yacc.restart() + +precedence = ( + ('left', 'OR_OP'), + ('left', 'AND_OP'), + ('right', 'NOT_OP'), +) + +parser = yacc.yacc()