如何在 c++ 中从字符串中解析数学公式

How to parse mathematical formulae from strings in c++

本文关键字:数学公式 字符串 c++      更新时间:2023-10-16

我想写一个程序,它接受像x^2+1这样的字符串并理解它。

我想要求用户输入她/他的功能,我希望能够处理和理解它。有什么想法吗?

char s[100];
s <- "x*I+2"
x=5;
I=2;
res=calc(s);
我认为

这可以通过字符串分析之类的东西来完成,但我认为这对我来说太难了。

我还有另一个想法,那就是在主程序中使用 tcc 并进行实时编译、运行和删除包含string s的单独程序(或函数)。

我每次都会创建一个临时文件,并要求 tcc 编译它并通过 exec 或类似语法运行它。

/*tmp.cpp:*/
#include <math.h>
void main(/*input args*/){
return x*I+2;
}

tmp.cpp将动态创建。

提前谢谢。

我成功使用,函数解析器

从 www 看起来它也支持 std::complex ,但我从未使用过它

使用递归下降解析器

示例:它是德语,但是一个小巧而强大的解决方案看这里

这正是您正在寻找的。更改函数read_varname以检测"x"或"I"等变量。

我不确定你期待什么。给出代码作为答案太复杂了,但总体思路不是很复杂。即使对于普通的业余程序员来说,代码也不是遥不可及的。

您需要定义语法,标记字符串,识别运算符,常量和变量。可能把表达式放到树上。编造一个替换变量的方法...你可以评估!

你需要有某种解析器。使数学运算可解析的最简单方法是用 RPN 编写它们。但是,您可以使用解析器库编写自己的解析器,例如来自boost或Yacc的Spirit

幸运的是,我最近写了一个!

查找 {,include/}lib/MathExpression/Term。它处理复杂的数字,但您可以轻松地将其调整为普通的旧浮点数。

许可证是 GPL 2。


理论简介,当你有一个这样的表达

X*(X+2)

您的最高级别的解析器可以解析形式为 A + B + C 的表达式...在本例中,A 是整个表达式。

您递归以解析优先级较高的运算符 A * B * C...在这种情况下,A 是 X,B 是 (X+2)

继续递归,直到解析基本标记(如 X)或点击左括号,在这种情况下,推送某种堆栈以跟踪您的位置,并使用顶级低优先级解析器递归到括号中。

我建议您使用 RAII 并在出现解析错误时抛出异常。