У меня есть приложение, которое включает в себя оценщик логических выражений с тремя операторами (& | !) с переменными и константами. Как правило, выражения не слишком длинные (возможно, максимум 50 терминов, но обычно намного меньше). Выражений может быть очень много — я ожидаю, что верхний предел будет около миллиона. В настоящее время у меня есть написанный от руки синтаксический анализатор с очень простым оценщиком, который просто рекурсивно обходит дерево синтаксического анализа. Одним из ограничений является то, что это должно вызываться из C++. У меня нет разделения между выражениями. Я хотел бы исследовать ускорение этого.
Я вижу два направления исследований.
- Добавьте совместное использование и сохраните состояние, указывающее, был ли оценен узел выражения или нет.
- Извлечь общие подвыражения.
Также я ожидаю, что подход с генерацией кода будет быстрее, чем подход с интерпретацией, работающий с деревьями синтаксического анализа или подобными структурами. Вероятно, было бы довольно просто сгенерировать некоторый код C++, но, учитывая длину функций, я не знаю, сможет ли такой компилятор, как GCC, оптимизировать CSE.
Я видел, что есть несколько библиотек, доступных для оценки выражений, но в моей рабочей среде добавление сторонних библиотек не так просто, и все они кажутся очень сложными по сравнению с моими потребностями.
Наконец, я немного недавно смотрел на Antlr4, так что это может быть для меня подходящим. В прошлом я работал над генерацией кода на C, но у меня нет опыта использования чего-то вроде LLVM для оптимизации и генерации кода.
Любые предложения, по какому пути идти?