suchbar 1.0.4

suchbar - enduser-learnable-language for database queries.
Documentation
// 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 }