符号计算

9
有人知道在C++中进行代数计算的好方法/库吗?
我正在开发一个需要进行代数计算的C++应用程序。目前,我构建了一个C++解析器,接受字符串形式的表达式,例如“5 +(2-MYFUNC(3))”,这些表达式被分词为结构体,然后使用Shunting Yard算法转换为后缀表示法并进行评估。
这些表达式中的MYFUNC是我自己定义的函数,可能会进行一些复杂的计算。
这是一个高性能的应用程序,表达式还具有动态替换为值的变量,并重新评估
例如:var1 +(2-MYFUNC(var2))->在运行过程中使用某些值替换var1和var2,并重新评估
我正在使用Linux,到目前为止找到了Giac library,但不确定它是否好用,欢迎任何反馈。
人们通常如何解决这个问题?在这种情况下,主要语言是C++。
3个回答

2
请看Bison和Flex解析器。基本思想是编写一个语法文件并将其转换为C代码,可以集成到您的应用程序中。任何一本关于Flex和Bison的书籍(http://www.amazon.com/Flex-Bison-Text-Processing-Tools/dp/0596155972)都足以进行初步阅读。
可能这会对您有所帮助!

谢谢,我会研究一下。我已经在寻找使用Boost::Spirit创建DSL的类似路径上了,但感觉这样做有些过度。从迄今为止的评论来看,编译后的C函数似乎是一个非常高效的解决方案。只需要找到合适的工具即可。 - Maksim Kneller

1

处理这个问题最快的方法可能是在运行时为定义的函数生成编译优化的函数,并对您可能拥有的不同变量值进行评估。您可以使用LLVM等工具来实现此目的。


这是否类似于正则表达式可以进行编译表达式以进行优化的方式? - Maksim Kneller
有一些相似之处,但据我所知,正则表达式会被编译成一个表格,这样更快地进行评估。使用LLVM,您将编译成机器代码,并获得一个函数指针来调用。您可以为每组变量值构建一个函数,或者更可能的是将它们作为参数传递给此函数。 - ergosys
但是由于主要的C++程序和LLVM函数都将被编译,因此在性能上实际上不会有任何区别。无论哪种情况下,代数字符串都将以相同的方式进行解析和评估,对吧? - Maksim Kneller
我不确定你的意思,所以我这样说。性能应该接近于实现代数函数的编译后的C++函数的速度。当然,您可以在运行时变化函数。在运行时编译会有一定的惩罚,但如果在许多函数执行中摊销,则可以忽略不计。 - ergosys

0

我会为这种语言编写一个递归下降解析器,因为语法看起来并不是很复杂。与Flex/Bison相比,解析可能会稍微慢一点,但我猜测在您的项目中,解析将是最不耗费计算资源的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接