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