]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/grammar
Reorder handling: AND - OR - NOT
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / grammar
index 7ded1c25988c04c2b998a76ae45f04e789eb2ac1..b88b9eddfa5fcada98134fe649558c167fd93a85 100644 (file)
@@ -4,13 +4,16 @@
 #  TAG - search blog posts that contain the tag;
 #  !TAG - search blog posts that don't contain the tag;
 #  TAG & TAG - search blog posts that contain both tags;
-#  TAG | TAG - search blog posts that contain one of the tags or both;
-# Parentheses are allowed to group expressions:
+#  TAG | TAG - search blog posts that contain any of the tags;
+# Parentheses are allowed to group expressions; for example:
 #  TAG & (TAG | TAG)
 #  !(TAG | TAG)
-# and so on. This  is the first version of the grammar and it allows
+# Allowed operators: conjunction - & && AND and
+#                    disjunction - | || OR or
+#                    negation    - !
+# This  is a simple version of the grammar and it allows
 # rather stupid expressions, like !!TAG or ((TAG)); in the future
-# it will be fixed by making the grammar stricter and more complex.
+# it will be fixed by making the grammar more complex and stricter.
 
 NAME : '[a-z][a-z0-9_]+'
 
@@ -20,8 +23,36 @@ OR_OP : '|'
 
 NOT_OP : '!'
 
+SP1 : '[ \t]+'
+
 expression : NAME
-           | expression AND_OP expression
-           | NOT_OP expression
-           | expression OR_OP expression
-           | '(' expression ')'
+           | expression SP0 AND_OP AND_OP SP0 expression
+           | expression SP0 AND_OP SP0 expression
+           | l_expression and_word r_expression
+           | expression SP0 OR_OP OR_OP SP0 expression
+           | expression SP0 OR_OP SP0 expression
+           | l_expression or_word r_expression
+           | NOT_OP SP0 expression
+           | expression_parens
+
+l_expression : expression_parens
+             | expression_sp
+
+r_expression : expression_parens
+             | sp_expression
+
+expression_parens : '(' SP0 expression SP0 ')'
+
+sp_expression : SP1 expression
+
+expression_sp : expression SP1
+
+and_word : 'A' 'N' 'D'
+         | 'a' 'n' 'd'
+
+or_word : 'O' 'R'
+        | 'o' 'r'
+
+SP0 : SP1 | empty
+
+empty :