我有一个应用程序,其中包含一个3运算符(& |!)布尔表达式求值程序,包含变量和常量。一般来说,表达式不会太长(最多可能是50个词,但通常会少很多)。可以有很多表达方式 - 我预计上限约为一百万。目前我有一个用一个非常简单的评估器编写的解析器,只需递归遍历解析树。一个限制是它必须从C++中调用。表达式之间没有共享。我想调查这个速度。快速布尔表达式求值器
我看到了两条研究途径。
- 添加共享并存储指示表达式节点是否已被评估的状态。
- 提取常见子表达式。
另外我希望代码生成方法比解析树或类似结构上的解释方法更快。生成一些C++代码可能相当简单,但考虑到函数的长度,我不知道像GCC这样的编译器是否能够优化CSE。
我已经看到有几个库可用于表达式评估,但在我的工作环境中添加第三方库并不简单,再加上它们都与我的需求相比看起来非常复杂。
最后,我最近一直在看Antlr4,所以这可能适合我。在过去,我从事C代码生成工作,但是我没有使用LLVM之类的东西来进行优化和代码生成。
任何建议走哪条路?
解析和lex的运行时间不应该是一个问题。这是一个独立于评估的阶段,可能会有几天的运行时间。所以即使几个小时的解析lex阶段也不成问题。评估速度是关键。 –
啊我明白了。然后误解你的问题。 ANTLR中的评估可能非常有效。有一种称为Mu的语法,我用它作为运行时表达式解释器的基础。 [链接](https://github.com/bkiers/Mu/tree/master/src/main/antlr4/mu)。 – TomServo