# calculator_parser
calculator_parser — це парсер для обробки складних математичних виразів. Він перетворює вхідний рядок у абстрактне синтаксичне дерево (AST) і потім обчислює його для отримання результату.
Парсер підтримує:
* Цілі числа (включаючи унарний мінус)
* Оператори: `+`, `-`, `*`, `/`, `^`
* Обробку дужок
* Коректний пріоритет операцій
* Право-асоціативне піднесення до степеня (`2^3^2` = `2^(3^2)` = 512)
## Команди
* Показати всі команди: `cargo run -- --help` або `make help`
* Показати credits: `cargo run -- --credits` або `make credits`
* Запустити інтерактивний режим: `cargo run` або `make run`
## Приклади роботи
2^(3^2)<br>
Результат: 512
2^(23 - (1 + 20)) + 2<br>
Результат: 6
(2 * 3)/(23 - (1 + 20)) + 1<br>
Результат: 4
## Граматика парсера
/// Ігноруємо пробіли, табуляцію та нові рядки.<br>
WHITESPACE = _{ " " | "\t" | "\n" }
/// Коректне число — це послідовність ASCII цифр<br>
int = @{ ASCII_DIGIT+ }
/// Оператор додавання<br>
add = { "+" }<br>
/// Оператор віднімання<br>
subtract = { "-" }<br>
/// Оператор множення<br>
multiply = { "*" }<br>
/// Оператор ділення<br>
divide = { "/" }<br>
/// Оператор піднесення до степеня<br>
power = { "^" }<br>
/// `primary` - це числа або вирази в дужках.<br>
factor = { (subtract)? ~ power_term }<br>
/// `power_term` - обробляє піднесення до степеня (право-асоціативне, тобто `2 ^ 3 ^ 2` -> `2 ^ (3 ^ 2)`)<br>
power_term = { primary ~ (power ~ factor)* }<br>
/// `expr` - обробляє додавання та віднімання (ліво-асоціативне, тобто `10 - 5 + 2` -> `(10 - 5) + 2`)<br>
expr = { term ~ ((add | subtract) ~ term)* }<br>
/// `term` - обробляє множення та ділення (ліво-асоціативне)<br>
term = { factor ~ ((multiply | divide) ~ factor)* }<br>
/// `expression` - кореневе правило, `expr` має покрити весь вхід<br>
expression = { SOI ~ expr ~ EOI }<br>
## Крейт
https://crates.io/crates/stasko_calculator_parser<br>
https://docs.rs/stasko_calculator_parser