我必须评估大量包含变量的表达式,并且我正在考虑编写一个小型自定义解释器以保持编译快速且小型。但是我对这个主题没有经验,并且有一些问题。
假设我们有一个包含数学表达式和一组有限对象的文件。该文件可能如下所示:
expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + ...
我想以某种方式解析它,以便我可以在我的应用程序中对表达式进行数值计算
通过简单地调用一个函数expr(float x, float y, float z)
。参数的数量不应该是固定的(EDIT -:每个表达式都有自己的定义,并带有适当数量的参数或接受数组),并且应允许括号嵌套以使输入文件保持相当小的大小。
由于表达式都是多项式类型,我可以想到数据结构应该是什么样子,但是解析看起来很困难。我已经在这里找到了一些类似问题的答案,例如使用Lua
.
然而,最大的问题是,与从自动生成的 C 代码直接编译这些表达式相比,创建和调用这些对象时的性能损失是什么。
提前致谢!
EDIT -:请考虑以下示例expr()
以上仅如此。我想最好的方法是使用模板类的对象来保存稀疏数组中变量的系数和幂。
性能有点像字符串的长度问题。在计算算术表达式时,解释型语言几乎总是比编译的 C 代码慢。但并不是很多程序将大部分时间都花在算术上,所以大多数时间这并不重要。无论您每次评估表达式时都解析表达式还是(从您所说的看来更有可能)将其解析为某种中间形式,这也会产生影响。
从你所说的内容中无法判断这对你是否重要,或者你的解释器的编写速度有多快,但就评估表达式所花费的时间而言,我不认为它会比慢 10 倍更好被关注到。最初的解释尝试要糟糕得多。
至于中间形式 - 通常开始的地方是使用 Dijkstra 的“调车场”算法将中缀表达式转换为逆波兰形式。这为您提供了一系列“符号”、“字节代码”,您可以随意称呼它们,并且很容易为该形式编写表达式求值器 - 每个运算符只需从堆栈中弹出其操作数,执行操作,然后将其压入结果入栈,直到最后只剩下表达式的最终值。数字文字和变量名就像“运算符”,不弹出任何操作数,而是压入其值。
[编辑 - 根据您的用户是谁,您的程序可能可以获取该文本文件,从中生成 C 程序,运行编译器,然后运行生成的程序(或者打开并调用生成的 dll)。显然,这依赖于许多特定于系统的东西(例如正在安装的编译器),并且需要对表达式进行足够多次的计算才能克服编译的开销。]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)