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