// search - section
GERMAN_LETTERS = _{ "ä" | "ö" | "ü" | "ß" | "Ä" | "Ö" | "Ü" | "ẞ" }
DANISH_LETTERS = _{ "æ" | "ø" | "å" | "Æ" | "Ø" | "Å" }
SWEDISH_LETTERS = _{ "ä" | "ö" | "å" | "Ä" | "Ö" | "Å" }
FINNISH_LETTERS = _{ "ä" | "ö" | "å" | "Ä" | "Ö" | "Å" }
NORWEGIAN_LETTERS = _{ "æ" | "ø" | "å" | "Æ" | "Ø" | "Å" }
ICELANDIC_LETTERS = _{ "ð" | "þ" | "Ð" | "Þ" }
SPANISH_LETTERS = _{ "á" | "é" | "í" | "ó" | "ú" | "ü" | "ñ" | "Á" | "É" | "Í" | "Ó" | "Ú" | "Ü" | "Ñ" }
FRENCH_LETTERS = _{
"à"
| "â"
| "æ"
| "é"
| "è"
| "ê"
| "ë"
| "ç"
| "î"
| "ï"
| "ô"
| "œ"
| "ù"
| "û"
| "ü"
| "ÿ"
| "À"
| "Â"
| "Æ"
| "É"
| "È"
| "Ê"
| "Ë"
| "Ç"
| "Ì"
| "Ï"
| "Ô"
| "Œ"
| "Ù"
| "Û"
| "Ü"
| "Ý"
}
EURO_LETTERS = _{ GERMAN_LETTERS | DANISH_LETTERS | SWEDISH_LETTERS | NORWEGIAN_LETTERS | ICELANDIC_LETTERS | FRENCH_LETTERS | SPANISH_LETTERS }
/// green
raw_char = _{ ("." | "," | "/" | "\\ " | "-")? ~ (ASCII_ALPHANUMERIC | EURO_LETTERS) }
raw_string = @{ (ASCII_ALPHANUMERIC | EURO_LETTERS) ~ raw_char* }
/// red
raw_string_interior = { (!PEEK ~ ("\\" ~ PEEK | ANY))* }
value = ${ raw_string | PUSH("\"" | "'") ~ raw_string_interior ~ POP }
/// brown
from_to = { (".." | "~") ~ value }
/// pink
starts_with = { "^" | "*" }
ends_with = { "$" | "*" }
term = { ( value ~ from_to | starts_with? ~ value ~ ends_with?) }
/// orange
field_name = ${ (ASCII_ALPHA | EURO_LETTERS) ~ (("_" | "-" | ".")? ~ (ASCII_ALPHANUMERIC | EURO_LETTERS))* }
/// white
eq = { "=!" | "=>" | "=<" | ">=" | "<=" | ">" | "<" | "!=" | "==" | "=" | "≥" | "≤" | "⩾" | "⩽" | "≠" }
field = { field_name ~ eq ~ term }
primary = _{ field | term | "(" ~ expr ~ ")" | "{" ~ expr ~ "}" | "[" ~ expr ~ "]" }
/// cyan
invert = { "!" | ^"NOT " }
atom = _{ invert? ~ primary }
/// yellow
and = { "&&" | ^"AND" }
/// yellow
or = { "||" | ^"OR" }
bin_op = _{ and | or }
expr = { atom ~ (bin_op? ~ atom)* }
// sort - section
/// blue
down = { "^" }
sort = { ";" ~ (","? ~ down? ~ field_name)+ }
query = _{ SOI ~ expr? ~ sort? ~ EOI }
WHITESPACE = _{ " " | "\t" | NEWLINE }