假设我们有一个包含数学表达式和一组有限的对象的文件.该文件可能如下所示:
expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + ...
我想以某种方式解析这个问题,所以我可以在我的应用程序中以数字方式评估表达式
通过简单地调用函数expr(float x,float y,float z).参数的数量不应该被修改(编辑:每个表达式都有自己的定义,具有适当的参数数量或者接受一个数组),并且应该允许嵌套括起来使输入文件保持相对较小.
由于表达式都是多项式类型,我可以想到数据结构应该如何,但解析看起来很困难.我已经在SO上找到了一些有关类似问题的答案,例如使用Lua.
然而,最大的问题是,与自动生成的C代码直接编译这些表达式相比,创建和调用这些对象时的性能损失是多大的.
提前致谢!
编辑:请仅考虑上面的expr()的例子.我想最好的办法是让一个模板类的对象在稀疏数组中保存变量的系数和权力.
解决方法
不可能从你所说的话中说出,对你来说是重要的,还是你写的翻译的速度有多快,但是我不会指望它的速度要慢10倍,只要花时间来评估表达式被关注到.首先尝试解读的情况差得多.
对于中间形式 – 通常的开始的地方是使用Dijkstra的“分流码”算法将您的中缀表达式转换为反向波形.这给你一个“符号”,“字节代码”的序列,称之为你喜欢的,并且很容易为该表单写一个表达式求值器 – 每个操作符只是从堆栈中弹出它的操作数,执行操作,然后推动结果到堆栈,直到表达式的最终值是剩下的唯一的东西.数字文字和变量名就像没有弹出操作数的“运算符”,并推送它们的值.
[编辑 – 取决于用户的身份,您的程序可能会采用该文本文件,从中生成C程序,运行编译器,然后运行生成的程序(或打开并调用到生成的dll).显然,依赖于很多系统特定的东西(一个编译器被安装,一个编译器),并且这些表达式需要被足够的时间进行评估,从而克服编译的开销.