int = { ("+" | "-")? ~ ASCII_DIGIT+ }
num = @{ int ~ ("." ~ ASCII_DIGIT*)? ~ (^"e" ~ int)? }
ident = _{ ASCII_ALPHA ~ ( ASCII_ALPHANUMERIC | "_" )* }
symbol = @{ ident }
operation = _{ add | subtract | multiply | divide | rem | power }
add = { "+" }
subtract = { "-" }
multiply = { "*" }
divide = { "/" }
rem = { "%" }
power = { "^" }
fun_call = { symbol ~ "(" ~ ( expr ~ ("," ~ expr)* )? ~ ")" }
expr = { term ~ (operation ~ term)* }
term = _{ num | fun_call | symbol | "(" ~ expr ~ ")" }
function = { symbol ~ "(" ~ ( symbol ~ ("," ~ symbol)* )? ~ ")" ~ ":=" ~ expr }
assignment = { symbol ~ ":=" ~ expr }
solvefor = { "solve" ~ expr ~ "=" ~ expr ~ "for" ~ symbol }
plot = { "plot" ~ symbol }
statement = _{ SOI ~ ( function | plot | solvefor | assignment | expr ) ~ EOI }
WHITESPACE = _{ " " | "\t" }