Ігноруємо пробіли, табуляцію та нові рядки.
WHITESPACE = _{ " " | "\t" | "\n" }
Коректне число — це послідовність ASCII цифр
int = @{ ASCII_DIGIT+ }
Оператор додавання
add = { "+" }
Оператор віднімання
subtract = { "-" }
Оператор множення
multiply = { "*" }
Оператор ділення
divide = { "/" }
Оператор піднесення до степеня
power = { "^" }
primary - це числа або вирази в дужках.
primary = { int | "(" ~ expr ~ ")" }
factor - обробляє унарні оператори(унарний мінус)
factor = { (subtract)? ~ power_term }
power_term - обробляє піднесення до степеня (право-асоціативне)
power_term = { primary ~ (power ~ factor)* }
term - обробляє множення та ділення (ліво-асоціативне)
term = { factor ~ ((multiply | divide) ~ factor)* }
expr - обробляє додавання та віднімання (ліво-асоціативне)
expr = { term ~ ((add | subtract) ~ term)* }
expression - кореневе правило, expr має покрити весь вхід
expression = { SOI ~ expr ~ EOI }