(РЕДАКТИРОВАНИЕ и заголовок, и основной текст и создали дополнительный вопрос, который возник)
Для нашего приложения было бы идеально проанализировать простой DSL логических выражений. Однако способ, которым я хотел бы сделать это, состоит в том, чтобы проанализировать (во время выполнения) входной текст, который дает выражения в некоторую лениво оцененную структуру (шаблон выражения), которая затем может быть использована в более чувствительном к производительности коде.
В идеале оценка должна быть максимально быстрой с использованием этой методики, поскольку она будет использоваться большое количество раз с различными значениями, заменяющими заполнители каждый раз. Я не ожидаю, что шаблон выражения будет эквивалентен по производительности, чтобы сказать жестко закодированную функцию, которая моделирует ту же функцию, что и заданная входная текстовая строка, т.е. нет необходимости идти по пути фактической компиляции, скажем, c ++, in situ запущенная программа (я полагаю, другие вопросы касаются динамической компиляции / загрузки библиотеки).
Мои собственные мысли при чтении примеров из boost заключаются в том, что я могу использовать boost :: spirit для разбора входного текста, и я уверен, что смогу разработать нужную грамматику. Тем не менее, я не уверен, как я могу комбинировать анализатор с boost :: proto для создания исполняемого шаблона выражения. Большинство примеров духа, которые я видел, являются просто интерпретаторами или заканчивают построением какого-то синтаксического дерева, но не идут дальше. Большинство примеров прототипов, которые я видел, предполагают, что DSL встроен в исходный код хоста и не нуждается в первоначальной интерпретации из строки. Я знаю, что boost :: spirit на самом деле реализован с boost :: proto, но не уверен, имеет ли это отношение к проблеме или этот факт предложит удобное решение.
Чтобы повторить, я должен быть в состоянии сделать что-то вроде следующего:
const std::string input_text("a && b || c");
// const std::string input_text(get_dsl_string_from_file("expression1.dsl"));
Expression expr(input_text);
while(keep_intensively_processing) {
...
Context context(…);
// e.g. context.a = false; context.b=false; context.c=true;
bool result(evaluate(expr, context));
...
}
Я был бы очень признателен за минимальный пример или даже небольшое ядро, на котором я мог бы построить, которое создает выражение из входного текста, которое оценивается позже в контексте.
Я не думаю, что это точно такой же вопрос, как здесь: парсинг логических выражений с бодрым духом
поскольку я не убежден, что это обязательно самый быстрый способ выполнения этого, даже если он выглядит очень умным. Со временем я постараюсь сделать тест всех опубликованных ответов.
Задача ещё не решена.
Других решений пока нет …