解析C类型声明的库?

3
我正在寻找一个开源库(用CC++编写),帮助我解析任意的C/C++类型声明(例如像void *(*(*foo[])( int, void * [] ))[123]这样的声明),然后将其元建模。
有没有人可以推荐一个开源的C/C++类型声明解析库?
注意:我不能使用GPL许可的代码(如cdecl工具),因为这是为一个闭源应用程序,我希望有一个比自己编写的更健壮的解决方案。

有很多好的语法图表,只需使用Bison http://www.gnu.org/software/bison/ - Hogan
cdecl 不是 GPL。它可能是公共领域:http://ridiculousfish.com/blog/posts/cdecl.html - cha0site
我认为Clang将其C和C++解析代码作为库进行了许可问题的限制。 - legends2k
也许你可以使用 https://bitbucket.org/eliben/pycparser 库?它是在BSD许可下发布的,并附带一个示例cdecl工具。 - Bojan Nikolic
我刚刚为此编写了自己的解析库:请参见cpp-typename-parser。由于C数据类型是C++数据类型的子集,因此这是一个可能的解决方案。 - Jakob Riedle
1个回答

1
解析C语言非常困难,为了实现你想要的功能,你可能需要名称和类型解析。要做到这一点,需要一个完整的编译器前端;实际上,你甚至需要预处理器,因为你将读取的代码将包含预处理指令。这些设备需要大量的工作来组合;你是对的,除非你有很多可用的时间,否则你真的不想自己编写它们。
你现实的选择是开源软件包,例如GCC(很难为你的任务进行调整),GCCXML(希望从格式良好的程序中生成声明)或Clang(类似);Eclipse CDT有一个C解析器(类似)。我无法确定这些软件包是否具有符合您要求的API或许可证。闭源软件包可能更符合您的需求;EDG提供C和C++前端(仍然只处理完全格式良好的程序),我的公司(Semantic Designs)也通过我们的DMS软件重构工具包提供C和C++前端。

这个集合中,只有DMS可能使得能够轻松地解析独立的类型声明;它可以解析其语法中的任何非终端符号(甚至包括模棱两可的符号)。更重要的是,如果你真的想要“转到元模型”,你可能需要解析一个声明,并确定子类型/引用类型(例如,如果它使用了typedef),因此你需要将完整的解析与名称/类型解析相结合,以提供背景定义,然后解析你关心的特定声明,最后使用背景定义提供的符号表上下文对特定声明进行名称和类型解析。DMS机制提供了所有这些功能。


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