анализатор:синтаксический анализ формул в файлах шаблонов
-
09-09-2019 - |
Вопрос
Сначала я опишу проблему, а затем то, на что я сейчас смотрю, с точки зрения библиотек.
В моем приложении у нас есть набор переменных, которые всегда доступны.Например:TOTAL_ITEMS, ЦЕНА, КОНТРАКТЫ И Т.Д. (у нас их около 15).Клиенты приложения хотели бы, чтобы определенные вычисления выполнялись и отображались с использованием этих переменных.До сих пор я постоянно добавлял эти вычисления в приложение.Это заноза в заднице, и я хотел бы сделать его более универсальным путем создания шаблона, в котором пользователь может указать набор формул, которые приложение будет анализировать и вычислять.
Вот один случай:
total_cost = CONTRACTS*PRICE*TOTAL_ITEMS
Итак, хотите сделать что-то подобное, чтобы пользователь мог определить в файле шаблона:
total_cost = CONTRACTS*PRICE*TOTAL_ITEMS
и какая-нибудь мета-дата, вроде экрана для ее отображения.Следовательно, они будут указывать формулу с помощью экрана.И файл будет содержать множество формул такого рода.
Прямо сейчас я смотрю на две библиотеки: Дух и матеваль
Кто-нибудь мог бы дать рекомендации, что лучше подходит для этой задачи, а также ссылки, примеры, links?
Пожалуйста, дайте мне знать, если вопрос неясен, и я постараюсь более подробно прояснить его .
Спасибо,
Саша
Решение
Если у вас есть фиксированное количество переменных, вызов синтаксического анализатора может быть немного излишним.Хотя Spirit - это круто, и я давно хотел использовать его в проекте.
Я бы, вероятно, просто обозначил строку, создал карту ваших переменных с указанием имени (предполагая, что все ваши переменные являются целыми числами):
map<const char*,int*> vars;
vars["CONTRACTS"] = &contracts;
...
Затем используйте простую функцию postfix calculator для выполнения фактических вычислений.
Редактировать:
Глядя на MathEval, кажется, что он делает именно то, что вы хотите;устанавливайте переменные и оценивайте математические функции, используя эти переменные.Я не уверен, зачем вам понадобилось бы создавать решение на уровне синтаксического анализатора.Есть ли у вас какие-либо требования, которым MathEval не соответствует?
Другие советы
Похоже, сгенерировать простой синтаксический анализатор с помощью yacc ( якц ) и бизон и интегрируйте это в свой код.
Я не знаю насчет matheval, но boost::spirit может сделать это для вас довольно эффективно :видишь там.
Если вы увлекаетесь шаблонным метапрограммированием, возможно, вам захочется ознакомиться с Повышение::Прото, но это будет потратьте некоторое время, чтобы начать им пользоваться.