X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=parser%2Fgrammar;h=694437875fcc62548065bef2d439eeb3a9f41f46;hb=a701255bb701988f09266b1d3bbbbf7a063094a0;hp=ade8b129eceb5b65576ee8edca20a6308fe2a09f;hpb=47606d9636fd6076cee67d444207aa66d30abfbe;p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git diff --git a/parser/grammar b/parser/grammar index ade8b12..6944378 100644 --- a/parser/grammar +++ b/parser/grammar @@ -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,13 +23,36 @@ OR_OP : '|' NOT_OP : '!' -SP0 : '[ \t]*' - SP1 : '[ \t]+' expression : NAME - | expression AND_OP expression - | expression OR_OP expression - | NOT_OP expression - | '(' expression ')' - | SP0 expression SP0 + | expression SP0 AND_OP AND_OP SP0 expression + | expression SP0 AND_OP SP0 expression + | l_expression and_word r_expression + | NOT_OP SP0 expression + | expression SP0 OR_OP OR_OP SP0 expression + | expression SP0 OR_OP SP0 expression + | l_expression or_word r_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 :