]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/grammar.ebnf
Version 0.6: Use parsley instead of parsimonious
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / grammar.ebnf
index 935e6a4d3477f7bfa557fde4a28c5dca83786eaa..43752574a181addd522514c7ff8e0e16d6346e6a 100644 (file)
 # 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 = <lletter lletterOrDigit*>: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 :