有一个很好的Python库可以解析C ++吗?

时间:2009-09-18 14:35:41

标签: c++ python

谷歌没有发现任何看似相关的内容。

我有一堆现有的,正在运行的C ++代码,我想使用python来浏览它并找出类之间的关系等。

编辑:只是想指出:我认为我不需要或想要解析C ++的每一点;我只需要足够聪明的东西来获取类,函数和成员变量声明,并跳过函数定义。

13 个答案:

答案 0 :(得分:44)

不是这样的答案,而只是为了演示实际上正确解析C ++的难度。我最喜欢的演示:

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位平台上是典型的),则它是d类型的局部变量a::b<c>的声明。如果条件不成立,那么它是一个无操作表达式((a::b < c) > d)。添加a::b的构造函数实际上会让您通过是否存在副作用来揭示差异。

答案 1 :(得分:32)

众所周知,C ++难以解析。大多数尝试正确执行此操作的人最终会拆分编译器。事实上,这是(部分)LLVM开始的原因:Apple需要一种解析C ++的方式,以便在XCode中使用,与编译器解析它的方式相匹配。

这就是为什么像GCC_XML这样的项目可以与python xml库结合使用。

一些似乎在解析C ++方面做得非常出色的非编译器项目是:

  • Eclipse CDT
  • OpenGrok
  • Doxygen的

答案 2 :(得分:5)

您将找不到用于执行此操作的插入式Python库。解析C ++是繁琐的,很少编写的解析器不是编译器的一部分。您可以找到问题的完整摘要here

最好的选择可能是clang,因为它的C ++支持是well-established。虽然这不是一个Python解决方案,但听起来它可以在Python包装器中重用,因为它的开发强调封装和良好的设计。

答案 3 :(得分:5)

答案 4 :(得分:4)

如果您以兼容的方式格式化了评论,doxygen做得非常好。如果你已经安装了graphviz,它甚至会绘制继承图。

例如,运行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文件中的条目。对于更复杂的设计,结果更有益 - 通常比尝试浏览源更容易。

答案 5 :(得分:4)

Pycparser是ANSI C的完整功能解析器。 也许你可以把它扩展到c ++: - )

答案 6 :(得分:1)

This page显示用Antlr编写的C ++语法,并从中can generate Python code

似乎还有人在pyparsing中使用C ++解析器,但我无法找出谁或其当前状态。

答案 7 :(得分:1)

没有(免费)好的库可以用任何语言解析C ++ 您最好的选择可能是Dehydra g ++插件,clangElsa

答案 8 :(得分:0)

pyparsing wiki显示了这个例子 - 它所做的只是解析结构声明,所以这可能只是让你看到问题的严重程度。

我建议你(甚至更好,你的雇主)支付200美元并购买Enterprise Architect from sparxsystems。该软件价格非常强大,包括非常好的代码逆向工程功能。在你自己的时间里,你将花费远远超过这个,只能完成约2%的工作。在这种情况下,“购买”胜过“制造”。

答案 9 :(得分:0)

Ctypes使用gcc-xml进行代码生成。 cpptypes也可能。即使没有,您也可以使用gcc-xml从C ++文件生成XML,然后使用内置或第三方Python XML解析器之一解析xml。

答案 10 :(得分:0)

这是一个声称解析c ++标头的SourceForge项目。正如其他评论者指出的那样,没有一般的解决方案,但是你觉得这样做足以满足你的需求。 (我只是为了类似的需要而遇到它并且还没有自己尝试过。)

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

答案 11 :(得分:0)

Clang项目提供了只用于解析C ++代码的库。

使用Clang和GCC,您可以生成代码的XML表示

如果您更喜欢更加Python的解决方案,您还可以搜索C ++ yacc语法并使用py-ply(Yacc for Python),但这似乎是需要更多工作的解决方案

答案 12 :(得分:0)

我会密切注意gcc.gnu.org/wiki/plugins,因为看起来插件是可行的。此外gcc-python-plugin似乎有一个很好的实现。