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