Skip to content

Latest commit

 

History

History
138 lines (103 loc) · 4.05 KB

File metadata and controls

138 lines (103 loc) · 4.05 KB

MathWorker

English version

Описание

С++ библиотека для обработки математических выражений с полностью настраиваемой сигнатурой. Способна парсить математические выражения из std строки. Можно добавлять в процессе работы новые константы, функции и операторы для сигнатуры.

Зависимости

C++20.

Ключевые особенности

  • Один заголовочный файл
  • 🚀 Легковесная и быстрая
  • 🔗 Без дополнительных библиотек
  • 🛠️ Полностью настраиваемая
  • Независима от <regex>

Установка

  1. Клонирование репозитория

    git clone https://github.com/Igorantivirus/MathWorker
  2. Добавьте путь к папке include в параметрах проекта
    Дайте проекту путь к папке include из распакованного репозитория, например, для VS22 это делается следующим образом:

    • Visual Studio 2022
      Перейдите в Имя проекта->Свойства->C/C++->Общее
      В поле Дополнительные катаолги включаемых файлов вставьте путь до папки "include".
  3. Подключите заголовочный файл в коде

    #include "MathWorker/MathWorker.hpp"

Документация

В разработке

Примеры

  1. Пример 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;
}
  1. Пример 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

Дорожная карта

  1. Переработка работы с памятью
  2. Добавление шаблонности
  3. Переработка добавления функций (для предотвращения ошибок)
  4. Вывод выражения после парсинга в LaTeX
  5. Релиз

Лицензия

The MIT License