【问题标题】:How to parse C++ source in Python? [closed]如何在 Python 中解析 C++ 源代码? [关闭]
【发布时间】:2011-06-20 08:43:51
【问题描述】:

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

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

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

这里首选 Python 作为标准语言之一,但这不是必需的。

【问题讨论】:

  • C++ 是出了名的难解析,你通常需要一些重量级的工具来完成它(例如 GLR 解析器)。如果有一个很好的 C++ 解析近似值而不使用一些非常强大的解析器,我会感到非常惊讶。
  • 您是否考虑过使用 GCC-XML (gccxml.org) 然后使用 python 来处理生成的 XML 文件?
  • 我听说世界上不超过三个完整的C++解析器——GCC的解析器,EDG的解析器,和也许微软的解析器(微软可能会也可能会不使用 EDG)。 LLVM 的人正在研究一个,但还没有完成,你可能从上面猜到涉及多少工作; SO上还有一个人(我忘了是谁)声称在他的公司有一个,但我无法评估这种说法。可悲的是,以上都不是 Python 中的。 EDG 的解析器旨在轻松吸引新消费者,但许可并不便宜。
  • +1 我喜欢 MS 的“也许”——但也许他们都应该是“也许”?
  • @DarenW:这在很大程度上取决于您当前的工具失败的程度以及原因。如果您确定了失败和原因,那么您可以了解需要什么级别的解析,例如:它是否已经与 CRTP 一起工作,是否由于没有建模命名空间查找规则而导致失败,您需要知道哪个#if/#else跟踪分支以获得准确的结果...?

标签: c++ python parsing code-analysis


【解决方案1】:

我会简单地推荐Clang

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

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

【讨论】:

  • 我不知道 CLang 已经处于这种状态。感谢您指出这一点!
  • 我已经尝试使用 CLang 来编译整个东西,但是在它的解析中存在一些晦涩的漏洞使得构建不会走得太远。不过,值得再次尝试,因为我喜欢有意义的错误消息。对于只分析源而不是构建,它可能是最好的工具。
  • FWIW,Clang官网用小写L拼写Clang。
  • @trinithis:是的,这是一个错字。我倾向于按 Shift 键太久:x 感谢您指出。
【解决方案2】:

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

【讨论】:

  • OpenC++ 的时间越来越长了。
  • “长牙”是什么意思?
  • @tenfour: 长在牙里=== 老了(这是因为老人的牙齿更长,更粗糙)。
  • “长牙”与多年来牙龈萎缩的马有关。 (免责声明:IANAHE = 我不是马专家)
【解决方案3】:

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

【讨论】:

  • 我们使用 doxygen,但这是否意味着我必须解析 XML 才能得到我想要的?
  • @DarenW:python 有一个 xml 库,不是吗?所以解析的所有繁重工作都应该为你完成,你只需要使用对象模型来提取你想要的细节。
【解决方案4】:

根据您对我们要求的说法,Tony 对 GccXML 的回答可能是最好的选择。如果这不起作用,您可以尝试使用 cscope 或 ctags 生成程序的大纲,然后从其输出中获取您想要的信息。

【讨论】:

  • 带有 -x 选项的 Ctags 写入的信息类似于我正在尝试创建的信息。但它并不完全正确。也许它可以按摩成我需要的东西。
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

    我在 PLY 方面有很好的经验:

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

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

    【讨论】:

    • 如果你想要一个完整的 C++ 解析器,你不想自己构建它,除非你想以此为职业。相信我。
    • 这不是 OP 所要求的。从 GCC 获取 AST 可能是最好的,但 OP 似乎不需要完整解析
    • 如果他不使用完整的解析器,他的答案将不准确。如果他不在乎他的答案是否准确,也许黑客会起作用。这通常最终会让人非常不满意。
    【解决方案7】:

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

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

    【讨论】:

    • 花钱并在 Windows 上运行的东西不会飞到这里,这是一个充满基于 Linux 的物理学家的蜂巢。您主要将它用于新系统吗?了解现有庞大的代码库是否有益?
    • 有趣的是,我们认为在几周内编写部分解决方案比花费 200 美元要好 - 通常这被认为是尖头老板的想法。是的,我已经使用它来了解现有代码库的大图,您实际上只需将其指向包含代码的目录,选择语言和文件扩展名,然后单击“Go”。当然,它可以生成一些非常复杂的图表,但它会根据您的目录和/或包结构分解图表,并且您可以在事后简化图表。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2010-12-31
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多