我有一堆现有的,正在运行的C ++代码,我想使用python来浏览它并找出类之间的关系等。
编辑:只是想指出:我认为我不需要或想要解析C ++的每一点;我只需要足够聪明的东西来获取类,函数和成员变量声明,并跳过函数定义。
答案 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 ++方面做得非常出色的非编译器项目是:
答案 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)
答案 8 :(得分:0)
pyparsing wiki显示了这个例子 - 它所做的只是解析结构声明,所以这可能只是让你看到问题的严重程度。
我建议你(甚至更好,你的雇主)支付200美元并购买Enterprise Architect from sparxsystems。该软件价格非常强大,包括非常好的代码逆向工程功能。在你自己的时间里,你将花费远远超过这个,只能完成约2%的工作。在这种情况下,“购买”胜过“制造”。
答案 9 :(得分:0)
答案 10 :(得分:0)
这是一个声称解析c ++标头的SourceForge项目。正如其他评论者指出的那样,没有一般的解决方案,但是你觉得这样做足以满足你的需求。 (我只是为了类似的需要而遇到它并且还没有自己尝试过。)
答案 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似乎有一个很好的实现。