(已编辑标题和主要文字,并创建了一个衍生的衍生问题)
对于我们的应用程序,解析一个简单的逻辑表达式DSL是理想的。但是,我想这样做的方法是解析(在运行时)输入文本,它将表达式赋予一些延迟评估的结构(表达式模板),然后可以在更具性能敏感性的代码中使用。
理想情况下,使用此技术尽可能快地进行评估,因为它将被大量使用,每次都会使用不同的值替换占位符。我不希望表达式模板在性能上等同于说出一个硬编码函数,它模拟与给定输入文本字符串相同的函数,即没有必要沿着实际编译的路径说,c ++,in a运行程序(我相信其他问题包括动态库编译/加载)。
我自己的想法是从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));
...
}
我真的很感激一个最小的例子,甚至只是一个我可以构建的小内核,它从输入文本创建一个表达式,稍后将在上下文中进行评估。
我认为这与此处发布的问题完全相同:parsing boolean expressions with boost spirit 因为我不相信这必然是最快的执行方式,即使它看起来非常聪明。我会及时尝试对所有贴出的答案进行基准测试。