Как проанализировать ввод DSL в высокопроизводительный шаблон выражения

(Отредактировал заголовок и основной текст и создал возникший дополнительный вопрос)

Для нашего приложения было бы идеально проанализировать простой 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));
    ...
}

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

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

0 ответов

Другие вопросы по тегам