WHITESPACE = _{ " " | "\t" | "\r\n" | "\n"}
boolean = {"true" | "false"}
null = {"null"}
number = ${ "0" | (ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*) }
u32 = ${ number ~ "u32" }
i32 = ${ "-"? ~ number ~ "i32" }
u64 = ${number ~ "u64" }
i64 = ${"-"? ~ number ~ "i64"? }
float = ${"-"? ~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*) ~ ("." ~ ASCII_DIGIT+) ~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+)?}
f32 = ${(float|number) ~ "f32" }
f64 = ${(float|number) ~ "f64" }
string_qt = ${ "\'" ~ inner ~ "\'" }
inner = @{ char* }
char = _{
!("\"" | "\\" | "\'") ~ ANY
| "\\" ~ ("\"" | "\'" | "\\" | "/" | "b" | "f" | "n" | "r" | "t" | "(" | ")")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
key = ${(ASCII_ALPHA ~ ASCII_ALPHANUMERIC? ~ "_"? )+}
array = { "[" ~ atom ~ ("," ~ atom+)* ~ "]"}
atom = {(u32 | u64 | i32 |f32 | f64 | string_qt | boolean | null | key | array | float | i64)}
dot = _{ "." }
sign = { "==" | "!=" | "~=" | ">=" | ">" | "<=" | "<" | "in" | "notIn" }
mod = {"%"}
mod_atom = {"%" ~ (u32|u64|i32|f32|f64)}
logic_and = {"&&"}
logic_or = {"||"}
op = _{ logic_and | logic_or }
len = {dot ~ "len()"}
to_datetime_us = {dot ~ "to_datetime_us()"}
left = { key ~ (len | to_datetime_us | mod_atom)? }
expression = { left ~ sign ~ atom }
grouped_expression = {"(" ~ (expression ~ op ~ expression ) ~ (op ~expression)* ~ ")"}
full_expression = { expression ~ ((op ~ expression) | (op ~ grouped_expression))* }