我需要为我正在研究的应用程序解析代数表达式,并且希望在对它进行破解之前加入一些集体智慧,并且可能会走错路。
我需要做的是非常直接:给定一个文本代数表达式(3 * x - 4(y - sin(pi)))创建方程的对象表示。自定义对象已经存在,所以我需要一个解析器来创建一个我可以走路的树来实例化我需要的对象。
基本要求是:
能够将代数表达为语法,因此我可以控制并根据需要自定义/扩展代数。
初始语法包括整数,实数,常数,变量,算术运算符(+, - ,*,/),幂(^),方程(=),括号,优先级和简单函数(罪(PI))。我希望能够相当快地扩展我的应用程序以支持正常的功能(f(x)= 3x +2)。
必须在C中编译,因为它需要集成到我的代码中。
我不需要以数学方式评估表达式,因此解决变量或执行算术的软件是噪声。
我已经完成了我的Google作业,看起来最好的方法是使用BNF语法和软件在C中生成编译器。所以我的问题:
BNF语法是否已经存在代数表达式(或者更好的是LaTex)的相应解析器生成器?有人必须已经这样做了。我真的想避免自己滚动,主要是因为我不想测试它。我愿意为图书馆(50美元以下)支付合理的金额
如果没有,您认为C的哪个解析器生成器最容易学习/使用?莱克斯? YACC? Flex,Bison,Python / SymPy,其他?我对这些中的任何一个都不熟悉。
答案 0 :(得分:5)
标准Linux工具flex和bison可能在这里最合适。 IIRC这些工具中使用的示例解析器和词法分析器可以完成您想要的操作,因此您可以只修改该代码以获得所需的内容。
这些工具看起来符合您的规格。您可以自定义语法,编译为C,并使用您想要的任何运算符。
答案 1 :(得分:4)
我和ANTLR的运气很好。它具有许多不同语言的运行时,包括C,并且具有用于指定语法和构建树的非常好的语法。我最近在131行写了一个类似的语法(代数表达式),这绝对是可以管理的。
答案 2 :(得分:1)
我使用了以下代码(在网上找到):
程序翻译基础“作者:Peter Calingaert
我增强了它来处理函数,它允许你实现“if(a,b,c)”之类的东西(有点像Excel的工作方式)。
答案 3 :(得分:0)
您可以自己构建简单的解析器,也可以使用任何流行的“compiler-compiler”(其中一些是其他帖子列出的)。只是决定你的解析器是否足够复杂以使用(和学习)外部工具。在任何情况下,你都需要定义语法,如果你没有以前的经验,通常这是最大脑密集型的任务。定义句法语法的正式方法是BNF或EBNF