# 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