Синтаксический анализатор/оценка выражения бизнес-правила С++

Я ищу предложения портативных облегченных библиотек, написанных на C++, которые поддерживают выражения и вычисления математических и бизнес-правил. Я понимаю, что C++ не предоставляет такой функциональности в STL.

Основное требование состоит в следующем:

Оцениваемые выражения будут состоять из чисел, строк и переменных, представляющих числа или строки.

Ожидается, что некоторые выражения будут оцениваться много раз в секунду (1000–2000 раз), поэтому существует требование высокой производительности вычислений выражений.

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

Я погуглил, но большинство «библиотек», которые я смог найти, представляют собой в значительной степени простые примеры алгоритма маневровой станции, большинство синтаксических анализаторов выражений выполняют синтаксический анализ и оценку на одном шаге, что делает их непригодными для непрерывных повторных оценок, и большинство из них поддерживают только числа.

Что я ищу:

  1. Библиотека, написанная на C++ (C++03 или C++11)
  2. Стабильный / достойный производства
  3. Быстрые оценки
  4. Портативный (win32/linux)
  5. Любые предложения по созданию высокопроизводительного механизма бизнес-правил.

Пример бизнес-правила:

'rule_result = (remaining_items ‹ min_items) и (item == "пляжный мяч")'


person Zamfir Kerlukson    schedule 06.10.2013    source источник
comment
См. schematron (размышляя, я сомневаюсь, что он сможет справиться с такими скоростями, если, возможно, правила не будут объединены вместе)   -  person user2246674    schedule 07.10.2013
comment
Выглядит интересно, но меня больше интересует то, что происходит с правилом, а не то, как оно хранится или представляется. Я обязательно посмотрю на schematron, поскольку у него, кажется, есть и другие интересные идеи.   -  person Zamfir Kerlukson    schedule 07.10.2013
comment
Я долго искал библиотеку на основе алгоритма RETE, так и не нашел то, что мне нужно. У меня могут быть некоторые предложения, но у меня не было возможности противостоять им.   -  person Arpegius    schedule 07.10.2013
comment
возможный дубликат Есть ли какой-либо класс выражения (C++)   -  person Macke    schedule 08.10.2013
comment
просто из любопытства, почему бы вам не использовать встраиваемый язык сценариев, такой как [Lua]lua.org? Это даст вам максимальную гибкость без особых накладных расходов.   -  person Dmitry Ledentsov    schedule 08.10.2013
comment
@DmitryLedentsov Мы пробовали подобное с внедрением Python. Но темпы переоценки были слишком медленными, поэтому искали решение, более родное для С++.   -  person Zamfir Kerlukson    schedule 11.10.2013
comment
@Arpegius, пожалуйста, не стесняйтесь делиться своими мыслями.   -  person Zamfir Kerlukson    schedule 11.10.2013
comment
@ZamfirKerlukson, python, возможно, был не лучшим выбором. Помимо самой привязки, вы можете многое выиграть от дизайна вашей библиотеки выражений. Если вы используете =запоминание или просто кешируете результаты, возможно, вам будет лучше, чем просто использовать даже быстрая оценка выражения бизнес-правила С++. У Lua очень низкие накладные расходы, и LuaJIT может дать дополнительный толчок.   -  person Dmitry Ledentsov    schedule 22.10.2013
comment
Известны ли ваши правила во время компиляции?   -  person ManuelAtWork    schedule 28.07.2017


Ответы (2)


См. библиотеку математических выражений C++, описанную в этот ответ.

Но если вам действительно нужна скорость, рассмотрите возможность компиляции выражений напрямую как C/C++, а затем загрузите их динамически (общие объекты/DLL).

person Macke    schedule 07.10.2013
comment
Мы попробовали библиотеку exprtk, и она хорошо подходит для выражения eval, спасибо за предложение. - person Zamfir Kerlukson; 11.10.2013
comment
Что касается компиляции выражений, которыми мы занимаемся сейчас, проблема в том, что этот подход не масштабируется по мере увеличения количества выражений, и клиенты хотят иметь возможность добавлять новые выражения или изменять текущие выражения. Таким образом, библиотека динамических выражений, подобная той, которую вы предложили, кажется лучшим балансом. - person Zamfir Kerlukson; 11.10.2013
comment
@ZamfirKerlukson: я говорю о том, чтобы ваша инфраструктура/приложение генерировала и компилировала библиотеки DLL «на лету» на основе данных, предоставленных клиентом. Это будет немного лучше масштабироваться, хотя загружать текст проще, чем двоичные файлы, это точно. ;) - person Macke; 22.10.2013

Рассматривали ли вы создание собственного синтаксического анализатора с помощью Bison + Flex? Он использует реализацию синтаксического анализатора LALR на основе FSM, быструю и простую в написании, и поддерживает оценку выражений во время их синтаксического анализа, а также генерацию AST для повторной оценки.

person Renan Gemignani    schedule 07.10.2013