1

编辑了标题和正文,并创建了一个衍生问题)

对于我们的应用程序,解析一个简单的逻辑表达式 DSL 将是理想的。然而,我想这样做的方法是解析(在运行时)输入文本,将表达式提供为一些惰性求值的结构(表达式模板),然后可以在对性能更敏感的代码中使用。

理想情况下,使用此技术进行评估会尽可能快,因为它将被多次使用,每次都会用不同的值替换占位符。我不希望表达式模板在性能上等同于说一个硬编码函数,该函数模拟与给定输入文本字符串相同的函数,即没有必要沿着实际编译的路线说,c++,原位运行程序(我相信其他问题包括动态库编译/加载)。

我自己阅读 boost 示例的想法是,我可以使用 boost::spirit 来解析输入文本,我相信我可以开发出我需要的语法。但是,我不确定如何将解析器与 boost::proto 结合起来构建一个可执行的表达式模板。我见过的大多数精神例子都只是解释器,或者最终构建了某种语法树,但没有进一步说明。我见过的大多数 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));
    ...
}

我真的很感激一个最小的例子,甚至只是一个我可以构建的小内核,它从输入文本创建一个表达式,稍后在上下文中进行评估。

我不认为这与此处发布的问题完全相同:解析布尔表达式与提升精神 ,因为我不相信这一定是最快的执行方式,即使它看起来非常聪明。及时我会尝试对发布的所有答案进行基准测试。

4

0 回答 0