С++ библиотека для обработки математических выражений с полностью настраиваемой сигнатурой. Способна парсить математические выражения из std строки. Можно добавлять в процессе работы новые константы, функции и операторы для сигнатуры.
C++20.
- ⚡ Один заголовочный файл
- 🚀 Легковесная и быстрая
- 🔗 Без дополнительных библиотек
- 🛠️ Полностью настраиваемая
- ✅ Независима от
<regex>
-
Клонирование репозитория
git clone https://github.com/Igorantivirus/MathWorker
-
Добавьте путь к папке include в параметрах проекта
Дайте проекту путь к папке include из распакованного репозитория, например, для VS22 это делается следующим образом:- Visual Studio 2022
Перейдите вИмя проекта->Свойства->C/C++->Общее
В полеДополнительные катаолги включаемых файловвставьте путь до папки "include".
- Visual Studio 2022
-
Подключите заголовочный файл в коде
#include "MathWorker/MathWorker.hpp"
В разработке
- Пример 1: Консольный калькулятор
#include <iostream>
#include <MathWorker/MathWorker.hpp>
using namespace mathWorker;
int main()
{
//Основная сигнатура и константы алгебры
Signature signature = generator::mathSignature();
VariableContext constants = generator::baseConstants();
MathParser parser(signature, std::make_unique<BaseTokenizer>(signature));
FunctionConnector connector;
std::string s;
while (true)
{
try
{
std::getline(std::cin, s);
std::cout << parser.parse(s)->replace(constants)->calculate(signature)->toString() << '\n';
}
catch (const ParseException& e)
{
std::cout << "Error: " << e.what() << ", type of error: " << static_cast<int>(e.type()) << '\n';
}
catch (...)
{
std::cout << "Unknown error" << '\n';
}
}
return 0;
}- Пример 2: Своя сигнатура
#include <iostream>
#include <MathWorker/MathWorker.hpp>
using namespace mathWorker;
int main()
{
Signature signature;
VariableContext constants;
MathParser parser(signature, std::make_unique<BaseTokenizer>(signature));
//Кастомный оператор
signature.addOperator("@", [](const std::vector<MathNodeP>& params)->MathNodeP
{
ComplexType left = params[0]->getNumberForced();
ComplexType right = params[1]->getNumberForced();
ComplexType res = left + right + left * right;
return std::make_unique<ValueNode>(res);
}, 0);
FunctionConnector connector;
//Добавление функции (один из 3-х способов)
connector.addFunction(signature, "f(x)=2@x@17");
std::string s = "f(1)@2";
std::cout << parser.parse(s)->replace(constants)->calculate(signature)->toString() << '\n';
return 0;
}Вывод: 323
- Переработка работы с памятью
- Добавление шаблонности
- Переработка добавления функций (для предотвращения ошибок)
- Вывод выражения после парсинга в LaTeX
- Релиз
The MIT License