如何在Python中解析C ++源代码?

时间:2011-02-02 23:59:02

标签: c++ python parsing code-analysis

我们希望解析我们庞大的C ++源代码树,以获取足够的信息以提供给另一个工具来制作类和对象关系图,识别事物的整体组织等。

到目前为止,我最好的尝试是扫描所有.cpp和.h文件的Python脚本,运行正则表达式搜索以尝试检测类声明,方法等。我们不需要一个完整的分析器来捕获每个细节,或者一些沉重的UML图生成器 - 我们要忽略很多细节,我们正在发明新的图表类型。脚本sorta有效,但是天哪,这是真的:C ++ 难以解析!

所以我想知道从我们的资源中提取我们想要的信息的工具是什么?我不是语言专家,也不想要有陡峭学习曲线的东西。我们低调的蓝领程序员咕噜声可以使用的东西:P

Python首选作为标准语言之一,但它并不重要。

7 个答案:

答案 0 :(得分:11)

我只是推荐Clang

这是一个基于C ++库的编译器,设计时考虑了重用性。它特别意味着您可以仅将其用于解析和生成抽象语法树。它负责所有繁琐的运算符重载解析,模板实例化等。

Clang导出一个基于C的接口,该接口使用Python Bindings进行扩展。界面通常很丰富,但我没有使用它。无论如何,如果您希望帮助扩展,我们欢迎您的贡献。

答案 1 :(得分:6)

您可以查看GccXML和OpenC ++,以及doxygen。

答案 2 :(得分:3)

您可以运行预处理步骤吗? Doxygen解析大多数C ++语法并使用所有关系创建xml。编译器还创建调试数据库(通常是来自gcc的dwarf格式和来自MSC的codeview格式)。

答案 3 :(得分:1)

根据您对我们要求的说法,Tony对GccXML的回答可能是最好的选择。如果这不起作用,你可以尝试使用cscope或ctags生成程序的轮廓,然后按照你想要的信息输出它。

答案 4 :(得分:1)

您要求提供可以从C ++中提取信息的工具。

我们的DMS Software Reengineering Toolkit是可配置的编译器技术,用于构建自定义分析器。它有一个带有preprocesser的完整C++ Front End,带有AST构造的完整C ++解析(包括注释的捕获)和完整的符号表。这些可用于提取此类结构信息,并将其导出到您想要处理的任何信息。

编辑:其中一条评论是世界上只有3个完整的C ++解析器。我怀疑更多;肯定IBM有一个有效的。 DMS的C ++前端已被用于MS Visual Studio和GNU C ++源代码中的大型应用程序,因此它也可能合理地符合条件: - }

答案 5 :(得分:0)

我对PLY有很好的经验:

http://www.dabeaz.com/ply/

但这需要一些lex和yacc的经验

答案 6 :(得分:0)

如果您可以使用Windows平台应用程序运行此分析,请节省大量时间和麻烦,并在Sparx Systems的Enterprise Architect上花费200美元(我与该公司没有任何关系,只是满意的客户)。 (注意:不应将此与Microsoft自己的Visual Studio“Enterprise Architect”包混淆。)

EA可以对许多语言进行反向工程,包括C ++,C,Java和Python,生成一些非常好的UML类图。 (EA提供了许多不同的软件包,桌面是最便宜的,但你必须通过Professional,第二便宜,才能获得代码工程功能。)我也喜欢生成的类图和序列图之间的集成,你在哪里可以在对象生命线之间拖动一条线,并根据目标对象的类定义向您呈现已定义方法的菜单。在我以前的咨询业务中,我们使用这个工具来开发系统架构提案,然后我们将其作为项目出价的一部分(仅将图表复制/粘贴到Word文档中)。它不需要很长时间才能收回200美元。