有没有一个好的Python库可以parsingC ++?

谷歌没有出现任何相关的东西。

我有一堆现有的,工作的C ++代码,我想用python来抓取它并找出类之间的关系等等。

编辑:只是想指出:我不认为我需要或想要parsingC ++的每一点; 我只是需要一些足够聪明的select类,函数和成员variables声明,并跳过函数定义。

C ++是非常难以parsing的。 大多数试图正确地做这件事的人最终会拆开一个编译器。 实际上,这是(部分)LLVM开始的原因:Apple需要一种方法来parsingC ++,以便在XCode中使用,与编译器parsing它的方式相匹配。

这就是为什么有像GCC_XML这样的项目,你可以结合一个Python的XML库。

一些似乎在parsingC ++方面做得非常好的非编译器项目是:

  • Eclipse CDT
  • OpenGrok
  • Doxygen的

不是这样的答案,而只是为了演示如何正确地parsingC ++。 我最喜欢的演示:

template<bool> struct a_t; template<> struct a_t<true> { template<int> struct b {}; }; template<> struct a_t<false> { enum { b }; }; typedef a_t<sizeof(void*)==sizeof(int)> a; enum { c, d }; int main() { a::b<c>d; // declaration or expression? } 

这是完全有效的,符合标准的C ++,但注释行的确切含义取决于您的实现。 如果sizeof(void*)==sizeof(int) (在32位平台上是典型的),它是a::b<c>types的局部variablesd的声明。 如果条件不成立,则它是一个无操作expression式((a::b < c) > d) 。 为a::b添加一个构造函数实际上可以让你通过存在/不存在副作用来显示差异。

多年来,我一直在使用pygccxml ,这是一个非常好的围绕GCC-XML的Python包装器。 这是一个非常全面的function包,它构成了一些很好用的代码生成工具的基础,例如来自同一作者的py ++ 。

你不会find一个embedded式Python库来做到这一点。 parsingC ++是很烦琐的,很less有parsing器不是编译器的一部分。 你可以在这里find一个很好的总结。

最好的select可能是铿锵的 ,因为它的C ++支持是完善的 。 虽然这不是一个Python解决scheme,但是听起来好像在Python封装中重用它一样,因为在开发过程中强调封装和良好的devise。

Pycparser是ANSI C的完整和functionparsing器。也许你可以把它扩展到c ++ 🙂

如果您已经以兼容的方式格式化了您的评论,那么Doxygen的工作非常出色。 如果你已经安装了graphviz,它甚至会绘制inheritance图。

例如,在下面运行DOxygen:

 /// <summary> /// A summary of my class /// </summary> public class MyClass { protected: int m_numOfWidgets; /// Keeps track of the number of widgets stored public: /// <summary> /// Constructor for the class. /// </summary> /// <param paramName="numOfWidgets">Specifies how many widgets to start with</param> MyClass(int numOfWidgets) { m_numOfWidgets = numOfWidgets; } /// <summary> /// Increments the number of widgets stored by the amount supplied. /// </summary> /// <param paramName="numOfWidgets">Specifies how many widgets to start with</param> /// <returns>The number of widgets stored</returns> IncreaseWidgets(int numOfWidgetsToAdd) { m_numOfWidgets += numOfWidgets; return m_numOfWidgets; } }; 

将所有这些评论变成.html文件中的条目。 使用更复杂的devise,结果更加有益 – 通常比浏览源代码更容易。

本页面显示了用Antlr编写的C ++语法,您可以从中生成Python代码 。

也似乎有人正在pyparsing中使用C ++分析器,但我无法找出谁或当前的状态。

没有(免费)好的库来parsingC ++的任何语言。
你最好的select可能是Dehydra g ++插件, clang或者Elsa 。

pyparsing wiki展示了这个例子 – 它所做的只是parsingstruct声明,所以这可能会让你看到问题的严重性。

我build议你(甚至更好的是你的雇主)花200美元购买Sparxsystems的Enterprise Architect 。 这个软件的价格非常强大,并且包含了很好的代码逆向工程特性。 在你自己的时间里,你将花费比这更多的工作,只完成约2%的工作。 在这种情况下,“买”胜过“制造”。

Ctypes使用gcc-xml代码生成。 cpptypes也有可能。 即使不这样做,也可以使用gcc-xml从C ++文件生成XML,然后使用内置或第三方Python XMLparsing器之一parsingxml。

这是一个声称parsingc ++头文件的SourceForge项目。 正如其他评论者指出的那样,没有一个通用的解决scheme,但是这听起来像是会满足您的需求。 (我只是碰到类似的需求,还没有尝试过呢。)

http://sourceforge.net/projects/cppheaderparser/

Clang项目提供了用于parsingC ++代码的库。

通过Clang和GCC,您可以生成代码的XML表示forms

如果你更喜欢Python的解决scheme,你也可以search一个C ++ yacc语法并使用Python(Yacc for Python),但是这似乎是需要更多工作的解决scheme

我会留意gcc.gnu.org/wiki/plugins ,因为看起来像插件是要走的路。 另外gcc-python-plugin好像有一个很好的实现。