在柠檬解析器中使用变量



我想在我的 Lemon 解析器驱动的应用程序中允许数学变量。 例如,如果用户输入 x^2+y,我希望能够为 x 和 y 的 100000 对不同的值评估它,希望不必每次都重新解析。 我能想到的唯一方法是让解析器生成一个对象树,然后在给定输入时计算表达式。 有没有更好/更简单/更快的方法?

性能在这里可能是一个问题。 但我也关心编码和代码维护的难易程度。

如果需要最易于维护的代码,请在解析时计算表达式。 不要建树。

如果你想重新执行表达式很多,

并且表达式很复杂,你需要避免重新解析(按最容易维护到最不可维护的顺序):构建树和评估,生成线程代码和评估,生成本机代码和评估。

如果表达式通常像您的示例一样简单,那么动态计算的递归下降手动编码解析器可能会非常快,并且工作得很好,即使对于 100,000 次迭代也是如此。 这样的解析器执行所需的时间可能比Lemon少得多。

这确实是你通常的做法,除非你想生成实际的(真实的或虚拟的)代码。 x 和 y 在您的情况下只是变量,因此您将填写实际值,然后调用 Evaluate 函数来计算表达式。然后,树节点将包含指向变量 x 和 y 的指针,依此类推。无需为每对测试值解析它。

相关内容

  • 没有找到相关文章

最新更新