解析C语言类定义字符串的最有效方法是什么?

5

我有一组用类C语言编写的函数定义,其中包括一些额外的关键字,这些关键字可以放在某些参数之前(就像“unsigned”或“register”一样),我需要分析这些代码以及一些函数存根,并从中生成实际的C代码。

  • Flex/Yacc是最合适的方法吗?

  • 与使用正则表达式编写Shell或Python脚本相比(如果额外关键字的数量变得更多且影响非常不同,这可能会成为痛苦),它会慢吗?考虑到我没有分析器/解析器的经验(尽管我知道LALR是如何工作的)?

  • 是否有关于Lex/Yacc的良好资料,涵盖类似的问题?我能找到的所有论文都使用了一个“ 玩具”计算器的相同简单示例。

任何帮助将不胜感激。

5个回答

3

ANTLR是一种常用的语言工具(Lex\Yacc也很常用)。它提供了一个框架,可以从包含各种目标语言中的动作的语法描述中构建识别器、解释器、编译器和翻译器。


@Mitch Wheat:我相信他指的是你关于ANTLR取代Lex\Yacc的评论。 - Jordan S. Jones
ANTLR并没有“取代”Lex/Yacc。它已经被证明是一个可行的替代品。LALR解析远未停歇。 - Ira Baxter

3

此外还有Lemon Parser,其语法限制较少。缺点是一旦发现某些限制,就必须将解析器的语法重写为其他内容,这很烦人。优点是它非常易于使用...并且是自包含的。您可以将其放入树中而不用担心检查其他组件是否存在。

SQLite3使用它,还有其他几个流行的项目也在使用。我不是说因为SQLite使用它,所以你也要使用它,但如果时间允许,可以尝试一下。


1

实际上,这取决于您的语言有多复杂以及它是否与C非常接近...

不过,即使是对于正则表达式,您也可以使用lex作为第一步....

我会选择lex + menhir和o'caml....

但任何flex/yacc组合都可以....

常规bison(yacc的gnu实现)的主要问题在于C类型..您必须描述整个树(以及所有操作函数)...使用o'caml会更容易...


1

这完全取决于你对“有效”的定义。如果你有充足的时间,最快的解析器将是手写的pull解析器。它们需要很长时间来调试和开发,但今天,在运行时性能方面,没有任何解析器生成器能够超过手写代码。

如果你想要在一周左右内解析有效的C代码,请使用解析器生成器。代码将足够快,并且大多数解析器生成器都带有C语言的语法,你可以将其用作起点(避免90%的常见错误)。

请注意,正则表达式不适合解析递归结构。这种方法既比使用生成器慢,而且比手写的pull解析器更容易出错。


而最后的10%会因为C语言的上下文敏感性而需要你再花费一年时间。问问GNU的人吧。 - Ira Baxter

0

针对您想要实现的目标,我们的 DMS软件重构工具包 可能是非常有效的解决方案。

DMS专门设计用于支持客户分析器/代码生成器,可以为您所讨论的类型提供非常强大的功能。它提供了非常强大的工具,用于定义任意语言解析器/分析器(已经在30多种真实语言上进行了测试,包括几个完整的C、C++、Java、C#和COBOL方言)。

DMS自动化构建AST(因此您无须做任何事情即可获得可用的AST),使得可以构建精确匹配您所描述的基于模式指导的自定义分析,可以构造新的C特定的AST,以代表您要生成的代码,并将其作为可编译的C源文本输出。DMS的预定义C定义可能可以用来覆盖您的类C语言。


3
这听起来像是对你要花大量现金购买产品的无耻推销,有趣的是,你在这里提到了完全相同的事情...https://dev59.com/fnRB5IYBdhLWcg3wv5o_ 这是一个问编程问题的地方,不是宣传商业软件的地方... - t0mm13b
问题是,“做这件事的最佳方法是什么”。答案应该合理地包括有帮助的软件,无论是商业软件还是非商业软件。是的,我有偏见,因为我在15年前就构思了这个答案,以回答这种问题。 - Ira Baxter

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