]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/parser.py
Allow ' AND ' and ' and '
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / parser.py
index 0af77f65f2e99054ff568226658e66b8e4d7608b..d278e4b210681817be55a9624083d3b7d62747a7 100644 (file)
@@ -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"""