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=43752574a181addd522514c7ff8e0e16d6346e6a;hp=935e6a4d3477f7bfa557fde4a28c5dca83786eaa;hb=3db3a1c52868d865cac4e96d6521f62feb15cf77;hpb=553446ee8da7062c60915a2078d1c7311e85d612 diff --git a/parser/grammar.ebnf b/parser/grammar.ebnf index 935e6a4..4375257 100644 --- a/parser/grammar.ebnf +++ b/parser/grammar.ebnf @@ -15,34 +15,37 @@ # This is a simple version of the grammar and it allows # rather stupid expressions, like (TAG) or ((TAG)) or !(!(TAG)). -expression = or_expression / aterm_expression +expression = inner_expression:e end -> e -or_expression = aterm_expression or_op expression +inner_expression = (or_expression | aterm_expression):e -> e -and_expression = term_expression and_op aterm_expression +or_expression = aterm_expression:a or_op inner_expression:e -> ('OR', a, e) -not_expression = not_op space0 (parens_expression / name) +and_expression = term_expression:t and_op aterm_expression:a -> ('AND', +t, a) -aterm_expression = and_expression / term_expression +not_expression = not_op ws (parens_expression | name):n -> ('NOT', n) -term_expression = not_expression / parens_expression / (name space_b4letter) +aterm_expression = (and_expression | term_expression):e -> e -parens_expression = "(" space0 expression space0 ")" +term_expression = (not_expression:e -> e) | (parens_expression:p -> p) | (name:n space_b4letter -> n) -and_op = (space0 ("&&" / "&") space0) / (space0 ("AND" / "and") space_b4letter) +parens_expression = '(' ws inner_expression:e ws ')' -> ('PARENS', e) -or_op = (space0 ("||" / "|") space0) / (space0 ("OR" / "or") space_b4letter) +and_op = (ws ('&&' | '&') ws) | (ws ('AND' | 'and') space_b4letter) -not_op = (space0 "!" space0) / (space0 ("NOT" / "not") space_b4letter) +or_op = (ws ('||' | '|') ws) | (ws ('OR' | 'or') space_b4letter) -letter = ~"[a-z]"i +not_op = (ws '!' ws) | (ws ('NOT' | 'not') space_b4letter) -name = ~"[a-z][a-z0-9_]*" +name = :n -> ('NAME', n) -space_b4letter = (space1 &letter) / space0 +lletter = :l ?(l in 'abcdefghijklmnopqrstuvwxyz') -> l -space0 = ~" *" +digit = :d ?(d in '0123456789') -> d -space1 = ~" +" +lletterOrDigit = (lletter | digit):c -> c + +space_b4letter = (' '+ ~~letter) | ws # vim: set ft=text :