парсер: синтаксический анализ формул в файлах шаблонов - PullRequest
3 голосов
/ 27 февраля 2009

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

В моем приложении у нас есть набор переменных, которые всегда доступны. Например: TOTAL_ITEMS, PRICE, CONTRACTS, ETC (у нас их около 15). Клиенты приложения хотели бы, чтобы эти вычисления выполнялись и отображались с использованием этих переменных. До сих пор я постоянно добавлял эти вычисления в приложение. Это боль в заднице, и я хотел бы сделать его более общим путем создания шаблона, в котором пользователь может указать набор формул, которые приложение будет анализировать и вычислять.

Вот один случай:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS

Итак, вы хотите сделать что-то подобное, чтобы пользователь определил в файле шаблона:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS и некоторая мета-дата, например, экран для ее отображения. Следовательно, они будут указывать формулу с экрана. И файл будет содержать много формул такого рода.

Сейчас я смотрю на две библиотеки: Дух и Матемаль

Кто-нибудь даст рекомендации, что лучше для этой задачи, а также ссылки, примеры, ссылки?

Пожалуйста, дайте мне знать, если вопрос неясен, и я постараюсь уточнить его.

Спасибо,

Саша

Ответы [ 3 ]

0 голосов
/ 27 февраля 2009

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

Я бы, вероятно, просто токенизировал строку, сделал бы карту ваших переменных с ключом по имени (при условии, что все ваши переменные являются целыми):

map<const char*,int*> vars;
vars["CONTRACTS"] = &contracts;
...

Затем используйте простую функцию постфиксного калькулятора для выполнения математических операций.

Edit:

Глядя на MathEval, кажется, он делает именно то, что вы хотите; установить переменные и оценить математические функции, используя эти переменные. Я не уверен, почему вы хотите создать решение на уровне синтаксического анализатора. Есть ли у вас какие-либо требования, которые MathEval не выполняет?

0 голосов
/ 27 февраля 2009

Я не знаю насчет matheval, но boost :: spirit может сделать это для вас довольно эффективно: см. там .

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

0 голосов
/ 27 февраля 2009

Похоже, не должно быть слишком сложно сгенерировать простой парсер с использованием yacc и bison и интегрировать его в свой код.

...