我想在我的Lemon解析器驱动的应用程序中允许数学变量。例如,如果用户输入x ^ 2 + y,我希望能够对x和y的100000个不同的值对进行评估,希望每次都不需要重新分析。我能想到的唯一方法是让解析器生成一个对象树,然后在给定输入时计算表达式。是否有更好/更简单/更快的方式?
性能可能是一个问题。但我也很关心编码的简易性和代码维护。
答案 0 :(得分:1)
如果您需要最易维护的代码,请在解析时评估表达式。不要建树。
如果你想重新执行表达式,并且表达式很复杂,你需要避免重新分析(按照大多数可维护的顺序):构建树并进行评估,生成线程代码并进行评估,生成本机代码和评估。
如果表达式通常与您的示例一样简单,则动态评估的递归下降手动编码解析器可能非常快,并且即使对于100,000次迭代也能很好地工作。执行这些解析器的时间可能比Lemon要少得多。
答案 1 :(得分:0)
除非您想生成实际(真实或虚拟)代码,否则确实是这样做的。 x和y只是你的情况下的变量,所以你要填写实际值,然后调用你的Evaluate函数来评估表达式。然后树节点将包含指向变量x和y的指针,依此类推。无需为每对测试值解析它。