анализатор:синтаксический анализ формул в файлах шаблонов

StackOverflow https://stackoverflow.com/questions/595314

Вопрос

Сначала я опишу проблему, а затем то, на что я сейчас смотрю, с точки зрения библиотек.

В моем приложении у нас есть набор переменных, которые всегда доступны.Например: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 может сделать это для вас довольно эффективно :видишь там.

Если вы увлекаетесь шаблонным метапрограммированием, возможно, вам захочется ознакомиться с Повышение::Прото, но это будет потратьте некоторое время, чтобы начать им пользоваться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top