需要一种在C中解析代数表达式的方法吗

需要一种在C中解析代数表达式的方法吗,c,parsing,math,grammar,algebra,C,Parsing,Math,Grammar,Algebra,我需要为我正在开发的一个应用程序解析代数表达式,希望在破解它之前,能有一点集体智慧,可能会走上错误的道路 我需要做的是非常直接的:给定一个文本代数表达式(3*x-4(y-sin(pi)),创建方程的对象表示。自定义对象已经存在,所以我需要一个解析器来创建一个树,我可以遍历它来实例化我需要的对象 基本要求是: 能够将代数表示为语法,因此我有控制权,可以根据需要自定义/扩展它 初始语法将包括整数、实数、常数、变量、算术运算符(+、-、*、/)、幂(^)、方程(=)、括号、优先级和简单函数(sin(p

我需要为我正在开发的一个应用程序解析代数表达式,希望在破解它之前,能有一点集体智慧,可能会走上错误的道路

我需要做的是非常直接的:给定一个文本代数表达式(3*x-4(y-sin(pi)),创建方程的对象表示。自定义对象已经存在,所以我需要一个解析器来创建一个树,我可以遍历它来实例化我需要的对象

基本要求是:

  • 能够将代数表示为语法,因此我有控制权,可以根据需要自定义/扩展它

  • 初始语法将包括整数、实数、常数、变量、算术运算符(+、-、*、/)、幂(^)、方程(=)、括号、优先级和简单函数(sin(pi))。我希望能很快地扩展我的应用程序,以支持适当的功能(f(x)=3x+2)

  • 必须用C编译,因为它需要集成到我的代码中

  • 我不需要对表达式进行数学计算,所以求解变量或执行算术的软件就是噪声

    我已经完成了谷歌作业,看起来最好的方法是使用BNF语法和软件生成C语言的编译器。所以我的问题是:

  • 是否已经存在一个BNF语法以及相应的代数表达式解析器生成器(或者更好的是,LaTex)?一定有人已经这么做了。我真的很想避免自己翻滚,主要是因为我不想测试它。我愿意为图书馆支付合理的费用(低于50美元)

  • 如果不是,您认为在这里最容易学习/使用哪个C解析器生成器?莱克斯?雅克?Flex、Bison、Python/SymPy等?这些我都不熟悉


  • 我和你的关系很好。它有许多不同语言的运行时,包括C语言,并且有非常好的语法来指定语法和构建树。我最近用131行写了一个类似的语法(代数表达式),这肯定是可以管理的。

    标准Linux工具flex和bison可能在这里最合适。IIRC这些工具中使用的示例解析器和lexer做的事情与您想要的非常接近,因此您可以修改代码以获得所需的内容


    这些工具似乎符合您的规格。你可以自定义语法,编译成C,并使用你想要的任何操作符。

    你可以自己构建简单的解析器,也可以使用任何流行的“”(其中一些被其他文章列出)。只需确定您的解析器是否足够复杂,可以使用(并学习)外部工具。在任何情况下,你都需要定义语法,如果你没有经验的话,这通常是大脑最密集的任务。定义语法语法的正式方法是或

    我使用了以下代码(在网上找到):

    彼得·卡林盖特的《程序翻译基础》


    我增强了它来处理函数,这样可以实现“if(a,b,c)”(类似于Excel的工作方式)。

    今天我花了一些时间研究了ANTLR。你能解决嵌套方程的“相互左递归”问题吗?例如,分数的分母本身可以是一个复杂项(4/(c*((1+1)/2)),等等。事实上,我的解析器可以很好地解析这个表达式。基本上,在顶层,你有最低优先级的运算符,然后你进入原子生成,它可以是数字、标识符或括号表达式。因为分数的分母带有分子“4"以左括号打开,没有歧义。作为Lexx/Yacc的替代方案,您可以尝试Dijkstra的调车场算法:这篇维基百科文章包含一个C语言的示例。我在这里找到了我需要的:感谢大家的周到反馈!-David事实上,这非常有用,因为它演示了如何构建树:何时在你的答案中包含指向外部来源的链接,始终确保在答案中包含来自该来源的重要部分,因为链接可能会随着时间的推移而消失。