8

我需要为我正在开发的应用程序解析代数表达式,并希望在尝试破解它之前能够积累一些集体智慧,并且可能会走错路。

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

基本要求是:

  1. 能够将代数表达为语法,因此我可以控制并根据需要对其进行自定义/扩展。

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

  3. 必须在 C 中编译,因为它需要集成到我的代码中。

我不需要以数学方式评估表达式,因此求解变量或执行算术的软件是噪声。

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

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

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

4

4 回答 4

5

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

这些工具似乎符合您的要求。您可以自定义语法,编译为 C,并使用您想要的任何运算符。

于 2011-01-09T21:17:29.700 回答
4

我在ANTLR上运气很好。它具有许多不同语言(包括 C)的运行时,并且具有用于指定语法和构建树的非常好的语法。我最近用131行写了一个类似的语法(代数表达式),这绝对是可以管理的。

于 2011-01-09T21:16:10.570 回答
1

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

程序翻译基础”,Peter Calingaert

我对其进行了增强以处理函数,它可以让您实现诸如“if(a, b, c)”之类的东西(有点像 Excel 做事的方式)。

于 2011-01-09T22:14:29.073 回答
0

您可以自己构建简单的解析器或使用任何流行的“编译器编译器”(其中一些已在其他帖子中列出)。只需决定您的解析器是否足够复杂以使用(和学习)外部工具。在任何情况下,您都需要定义语法,如果您没有经验,通常这是最耗费脑力的任务。定义句法文法的正式方式是BNFEBNF

于 2011-01-09T21:35:51.203 回答