В этом репозитории содержится реализация алгоритма сортировочной станции на языке C++.
- Работа с числами с плавающей точкой. Используется тип double.
- Поддержка скобок в выражении.
- Поддержка арифметических операций:
- '+' сложение
- '-' вычитание
- '*' умножение
- '/' деление
- '^' возведение в степень
- Поддержка функций. Поддержка n-арных функций:
- Тригонометрия: sin, cos, tan, cot
- abs(x) - абсолютное значение x (модуль числа x)
- sgn(x) - сигнум числа x: sgn(x) = {1 IF x > 0; 0 IF x = 0; -1 IF x < 0}
- pow(a, b) - аналогично 'a ^ b'
- Поддержка унарного минуса:
- -(...)
- -function(...)
- -a^b = -(a ^ b)
double Eval::eval(const std::string&)
Вычисляет значение выражения заданного строковым параметром.
Полный алгоритм вычисления выражений (evaluation) состоит из 3 этапов:
- Разбиение строки на токены (Структура, п. 3).
- Алгоритм сортировочной станции, трансформация в обратную польскую нотацию (Структура, п. 4).
- Вычисление выражения в обратной польской нотации (Структура, п. 5).
- Для удобства вычисления реализована композиция всех 3 шагов (Структура, п. 2).
- В исходной строке пропускаются все пробельные символы (' ', '\n', '\t').
- Если встречается число, осуществляется попытка сборки числа (eval.cpp: constructNumber).
- Если встречается оператор:
- Осуществляется проверка на унарный минус.
- Создаётся токен с указателем на соответствующее представление оператора из OperatorMap operators.
- Если встречается скобка, создаётся токен с типом, соответствующим скобке (RightBrace, LeftBrace).
- Если встречается запятая, создаётся токен с типом разделителя аргументов (ArgsSep).
- Если встречается буквенный символ, осуществляется попытки сборки имени функции (eval.cpp: constructName).
- Если символ в строке не обработан к этому моменту, выбрасывается ошибка InvalidInput.
На каждом этапе 1-6 осуществляется проверка на то, может ли новый токен с типом Т1 соответствовать предыдущему токену с типом Т2.
Пока что пусто
Пока что пусто
- Пространство имён Eval. Далее всё, что в нём определено.
double eval(const std::string&)
- вычисление выражения заданного строкой.std::vector<Token> tokenize(const std::string&)
- токенизация выражения заданного строкой.std::vector<Token> shuntingYard(const std::vector<Token>&)
трансформация токенизированного выражения в Обратную Польскую Нотацию. Непосредственно Алгоритм Сортировочной Станции.double eval(const std::vector<Token>&)
- вычисление выражения в Обратной Польской Нотации.struct Token
- представление минимальной единицы выражения (токена).enum class Type
- тип токена.- Number(0) - число.
- Operator - оператор.
- Function - имя функции.
- LeftBrace - левая скобка: '('.
- RightBrace - правая скобка: ')'.
- ArgsSep - разделитель аргументов функции ','.
union UValue
- возможные значения токена в соответствии с его типом.- double number - если токен - число.
- Operator* oper - если токен - оператор.
- Function* func - если токен - функция.
- Type type - тип токена.
- UValue value - значение этого токена.
- Конструкторы определены для каждого возможного типа токена. Также определен конструктор без параметров.
struct Operator
- представление оператора.- std::string name - имя оператора.
- unsigned int priority - приоритет оператора.
enum class Associativity
- ассоциативность оператора- Left(0) - левая.
- Right - правая
- double(*func)(double, double) - функция, выполняемая над операндами оператора.
struct Function
- представление функции.- std::string name - имя функции.
- size_t argc - число аргументов, принимаемых функцией.
- double(*func)(std::vector&) - функция, выполняемая над аргументами.
std::ostream& operator<<(std::ostream&, Token)
- вставка токена в поток вывода. Для удобного вывода токенов в консоль/файл.using OperatorMap = typename std::unordered_map<char, Operator*>
- соответствие между символом оператора и его представлением.using FunctionMap = typename std::unordered_map<std::string, Function*>;
- соответствие между именем функции и её представлением.- OperatorMap operators - все доступные операторы определены в этом отображении.
- FunctionMap functions - все доступные функции определены в этом отображении.
enum class MinusState
- состояния токенизатора для разграничения бинарного и унарного операторов -.