// Like SQL strings 'Tim''s dog'
string = ${ "'" ~ ( "''" | (!"'" ~ ANY) )* ~ "'" }
num_u64 = @{ASCII_DIGIT+}
num_i64 = @{ "-" ~ ASCII_DIGIT+}
num_f64 = @{
"-"?
~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*)
~ ("." ~ ASCII_DIGIT*)
~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+)?
}
num_placeholder = @{"?"} // for use in query macro
value= { num_f64 | num_i64 | num_u64 | string | num_placeholder }
filter0_name = {^"nen" | ^"eqn"}
filter1_name = {^"eq" | ^"ne" | ^"lt" | ^"gt" | ^"le" | ^"ge" | ^"lk" |^"re" }
filter2_name = {^"bw"}
filterx_name = {^"in" | ^"out" }
filterc_name = {^"fn" ~ name}
filter0 = { filter0_name }
filter1 = { filter1_name ~ value }
filter2 = { filter2_name ~ value ~ value }
filterx = { filterx_name ~ value+ }
filterc = { filterc_name ~ value* }
field_filter = {filter0 | filter1 | filter2 | filterx |filterc }
sort = @{ ("+" | "-") ~ASCII_DIGIT* }
name = @{ ASCII_ALPHA ~ ASCII_ALPHANUMERIC* }
field_path = @{ name ~ ("_" ~ name)* }
hidden = @{"."}
wildcard_path= @{field_path ~ "_"}
wildcard = @{ (field_path ~ "_")? ~ "*" }
field = { sort? ~ hidden? ~ field_path }
field_clause = { field ~ field_filter? }
predicate_arg = { value+}
predicate_name = { "@" ~ field_path}
predicate_clause = { predicate_name ~ predicate_arg? }
selection_clause = { "$" ~ selection_name? }
selection_name = { field_path }
query_placeholder = @{"{}"} // for use in query macro
clause = { field_clause | predicate_clause | selection_clause | query_placeholder |( lpar ~ expr ~ rpar) }
separator = { "," | ";" }
lpar = @{"("}
rpar = @{")"}
expr = { (wildcard | clause ) ~ (separator ~ (wildcard | clause))*}
query = { SOI ~ expr? ~ EOI }
WHITESPACE = _{ " " }