]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/grammar.ebnf
Docs(TODO): Try Pyleri
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / grammar.ebnf
index b657738ad5f30a6ab29508f8364b212faffa4708..3be4d166e0ed7eac1643b7e0176d35e2e75f7d8a 100644 (file)
 #                    disjunction - | || OR or
 #                    negation    - ! NOT not
 # This  is a simple version of the grammar and it allows
-# rather stupid expressions, like !!TAG or ((TAG))
+# rather stupid expressions, like !!TAG or ((TAG)); in the future
+# it will be fixed by making the grammar more complex and stricter.
 
-@@grammar :: Tags
+?start : expression
 
-start = expression $ ;
+?expression : or_expression
+            | and_expression
+            | and_sub_expression
 
-expression = (
-           | expression and_op expression
-           | expression or_op expression
-           | not_op expression
-           | expression_parens
-           | name ) ;
+or_expression : or_sub_expression (or or_sub_expression)+
 
-expression_parens = '(' expression ')' ;
+?or_sub_expression : and_expression
+                   | and_sub_expression
 
-name = /[a-z][a-z0-9_]+/ ;
+and_expression : and_sub_expression (and and_sub_expression)+
 
-and_op = '&' | '&&' | 'AND' | 'and' ;
+?and_sub_expression : not_expression
+                    | expression_parens
+                    | name
 
-or_op = '|' | '||' | 'OR' | 'or' ;
+not_expression: not and_sub_expression
 
-not_op = '!' | 'NOT' | 'not' ;
+expression_parens : "(" expression ")"
+
+name : /[a-z][a-z0-9_]+/
+
+?and : and_op
+     | and_op and_op
+     | and_word
+
+?or : or_op
+    | or_op or_op
+    | or_word
+
+?not : not_op
+     | not_word
+
+?and_op : "&"
+
+?or_op : "|"
+
+?not_op : "!"
+
+?and_word : "AND"
+          | "and"
+
+?or_word : "OR"
+         | "or"
+
+?not_word : "NOT"
+          | "not"
+
+%import common.WS
+%ignore WS