X-Git-Url: https://git.phdru.name/?p=phdru.name%2Fcgi-bin%2Fblog-ru%2Fsearch-tags.git;a=blobdiff_plain;f=parser%2Fgrammar.ebnf;fp=parser%2Fgrammar.ebnf;h=935e6a4d3477f7bfa557fde4a28c5dca83786eaa;hp=ce21b642621acec201493329aa4b1126d6dbfd01;hb=fcd51c190450165c3315ed7e4f77bc1415db3d48;hpb=8de4e007a7dfd93c4428a50744640f6c3f61e751 diff --git a/parser/grammar.ebnf b/parser/grammar.ebnf index ce21b64..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; @@ -15,30 +15,34 @@ # This is a simple version of the grammar and it allows # 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 = expression1 !or_op | or_expression ; +and_expression = term_expression and_op aterm_expression -or_expression = expression1 or_op expression ; +not_expression = not_op space0 (parens_expression / name) -and_expression = expression2 and_op expression1 ; +aterm_expression = and_expression / term_expression -not_expression = not_op expression3 ; +term_expression = not_expression / parens_expression / (name space_b4letter) -parens_expression = '(' expression ')' ; +parens_expression = "(" space0 expression space0 ")" -expression1 = expression2 !and_op | and_expression ; +and_op = (space0 ("&&" / "&") space0) / (space0 ("AND" / "and") space_b4letter) -expression2 = !not_op expression3 | not_expression ; +or_op = (space0 ("||" / "|") space0) / (space0 ("OR" / "or") space_b4letter) -expression3 = parens_expression | name ; +not_op = (space0 "!" space0) / (space0 ("NOT" / "not") space_b4letter) -and_op = '&&' | '&' | 'AND' | 'and' ; +letter = ~"[a-z]"i -or_op = '||' | '|' | 'OR' | 'or' ; +name = ~"[a-z][a-z0-9_]*" -not_op = '!' | 'NOT' | 'not' ; +space_b4letter = (space1 &letter) / space0 -name = /[a-z][a-z0-9_]+/ ; +space0 = ~" *" + +space1 = ~" +" + +# vim: set ft=text :