X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=parser%2Fgrammar.ebnf;h=935e6a4d3477f7bfa557fde4a28c5dca83786eaa;hb=fedd68ad8ee4b3a7115df429e1f0c2d99e3885f8;hp=b657738ad5f30a6ab29508f8364b212faffa4708;hpb=3eadd8423e41b70e89854bd63e0e9875e259978c;p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git diff --git a/parser/grammar.ebnf b/parser/grammar.ebnf index b657738..935e6a4 100644 --- a/parser/grammar.ebnf +++ b/parser/grammar.ebnf @@ -1,4 +1,4 @@ -# Grammar rules for tag searching; EBNF. +# Grammar rules for tag searching # The grammar defines expressions in the following forms: # TAG - search blog posts that contain the tag; @@ -11,26 +11,38 @@ # Allowed operators: conjunction - & && AND and # disjunction - | || OR or # negation - ! NOT not +# Usual priority: NOT recognized before AND, AND before OR. # 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)) or !(!(TAG)). -@@grammar :: Tags +expression = or_expression / aterm_expression -start = expression $ ; +or_expression = aterm_expression or_op expression -expression = ( - | expression and_op expression - | expression or_op expression - | not_op expression - | expression_parens - | name ) ; +and_expression = term_expression and_op aterm_expression -expression_parens = '(' expression ')' ; +not_expression = not_op space0 (parens_expression / name) -name = /[a-z][a-z0-9_]+/ ; +aterm_expression = and_expression / term_expression -and_op = '&' | '&&' | 'AND' | 'and' ; +term_expression = not_expression / parens_expression / (name space_b4letter) -or_op = '|' | '||' | 'OR' | 'or' ; +parens_expression = "(" space0 expression space0 ")" -not_op = '!' | 'NOT' | 'not' ; +and_op = (space0 ("&&" / "&") space0) / (space0 ("AND" / "and") space_b4letter) + +or_op = (space0 ("||" / "|") space0) / (space0 ("OR" / "or") space_b4letter) + +not_op = (space0 "!" space0) / (space0 ("NOT" / "not") space_b4letter) + +letter = ~"[a-z]"i + +name = ~"[a-z][a-z0-9_]*" + +space_b4letter = (space1 &letter) / space0 + +space0 = ~" *" + +space1 = ~" +" + +# vim: set ft=text :