Parsing 在Lemon解析器中使用变量?

Parsing 在Lemon解析器中使用变量?,parsing,math,parser-generator,lemon,Parsing,Math,Parser Generator,Lemon,我想在我的Lemon解析器驱动的应用程序中允许数学变量。例如,如果用户输入x^2+y,我希望能够对100000对不同的x和y值进行评估,希望每次都不必重新分析。我能想到的唯一方法是让解析器生成一个对象树,然后在给定输入时对表达式求值。有更好/更简单/更快的方法吗 性能可能是这里的一个问题。但我也关心编码和代码维护的易用性。除非您想生成实际的(真实的或虚拟的)代码,否则您通常会这样做。在您的例子中,x和y只是变量,因此您需要填写实际值,然后调用求值函数对表达式求值。然后,树节点将包含指向变量x和y

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


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

除非您想生成实际的(真实的或虚拟的)代码,否则您通常会这样做。在您的例子中,x和y只是变量,因此您需要填写实际值,然后调用求值函数对表达式求值。然后,树节点将包含指向变量x和y的指针,依此类推。无需为每对测试值解析它。

如果您想要最可维护的代码,请在解析时对表达式求值。不要造树

如果您想多次重新执行表达式,并且表达式很复杂,那么您需要避免重新分析(按照从最易维护到最不易维护的顺序):构建树并求值,生成线程化代码并求值,生成本机代码并求值

如果表达式通常像您的示例一样简单,那么一个递归下降手工编码的解析器可能会非常快,并且工作得非常好,即使是100000次迭代。这样的解析器执行的时间可能比Lemon少得多