Expand description
Uses the pest
parsing expression grammar language.
real_literal = @{ int ~ ("." ~ ASCII_DIGIT*)? ~ (^"e" ~ int)? }
int = { ("+" | "-")? ~ ASCII_DIGIT+ }
string_literal = ${ "\"" ~ string_literal_value ~ "\"" }
string_literal_value = @{ char* }
char = { !illegal ~ ANY }
illegal = { "\"" | "\\" }
variable = @{ leading ~ following* }
leading = _{ ASCII_ALPHA | "_" }
following = _{ ASCII_ALPHANUMERIC | "_" }
real_variable = ${ variable }
str_variable = ${ variable }
binary_real_op = _{ add | subtract | multiply | divide | power }
add = { "+" }
subtract = { "-" }
multiply = { "*" }
divide = { "/" }
power = { "^" }
unary_real_op = _{ neg }
neg = { "-" }
binary_logic = _{ and | or }
and = { "&&" }
or = { "||" }
unary_logic = _{ not }
not = { "!" }
real_comparison = _{ real_eq | real_neq | le | less | ge | greater }
real_eq = { "==" }
real_neq = { "!=" }
less = { "<" }
le = { "<=" }
greater = { ">" }
ge = { ">=" }
string_comparison = _{ str_eq | str_neq }
str_eq = { "==" }
str_neq = { "!=" }
real_expr = { binary_real_op_expr | unary_real_op_expr }
string_expr = { str_variable | string_literal }
binary_real_op_expr = _{ binary_real_op_term ~ (binary_real_op ~ binary_real_op_term)* }
binary_real_op_term = _{ "(" ~ real_expr ~ ")" | unary_real_op_expr | real_literal | real_variable }
unary_real_op_expr = { unary_real_op ~ unary_real_op_term }
unary_real_op_term = _{ "(" ~ real_expr ~ ")" | binary_real_op_expr | real_literal | real_variable }
bool_expr = { binary_logic_expr | unary_logic_expr | real_compare_expr | string_compare_expr }
binary_logic_expr = _{ binary_logic_term ~ (binary_logic ~ binary_logic_term)* }
binary_logic_term = _{ "(" ~ bool_expr ~ ")" | unary_logic_expr | real_compare_expr | string_compare_expr }
unary_logic_expr = { unary_logic ~ unary_logic_term }
unary_logic_term = _{ "(" ~ bool_expr ~ ")" | binary_logic_expr | real_compare_expr | string_compare_expr }
real_compare_expr = _{ real_compare_expr_term ~ real_comparison ~ real_compare_expr_term }
real_compare_expr_term = _{ "(" ~ real_expr ~ ")" | unary_real_op_expr | binary_real_op_expr }
string_compare_expr = _{ string_compare_expr_term ~ string_comparison ~ string_compare_expr_term }
string_compare_expr_term = _{ string_expr }
expr = _{ bool_expr | real_expr }
calculation = _{ SOI ~ expr ~ EOI }
WHITESPACE = _{ " " | "\t" }