我正在寻找一种方法来解析c ++代码以检索有关类的一些基本信息。我实际上并不需要代码本身的大量信息,但我确实需要它来处理宏和模板之类的东西。简而言之,我想提取代码的“结构”,你将在UML图中显示。
对于代码库中的每个类/ struct / union / enum / typedef,我需要的所有内容(在处理模板和宏之后)是:
代码中的实际说明与我的目的无关。
我期待很多人说我应该使用正则表达式(甚至是Flex&amp; Bison),但这些并不是真正有效的,因为我需要正确处理预处理器和模板。< / p>
答案 0 :(得分:5)
听起来像gcc-xml的作业与您选择的c ++ xml-library或xml友好的脚本语言相结合。
答案 1 :(得分:4)
在代码上运行Doxygen可以提供大部分内容,不是吗?
您想要输出的格式是什么?
答案 2 :(得分:4)
另见Ira Baxter,cites his own product。
警告:请注意,只有Elsa“......我听到相当不错的工作......”在构建符号表时,根据Ira Baxter的说法,OP的原始意图是必要的(见评论)对于这个答案 - 我引用他是因为他是该领域的专家。
答案 3 :(得分:2)
Exuberant Ctags将为您提供所需的大部分内容,编辑通常会使用它来提供代码导航。
可能会阻止某些模板...
答案 4 :(得分:2)
DMS Software Reengineering Toolkit是通用程序分析和转换机制。它的C++ Front End基于DMS,为各种常见的C ++方言提供全功能的C ++解析,可以同时处理一组C ++类,并构建您可以以任何方式使用的全名/类型/访问信息。信息被标记为精确的原始文件/行/列。 (它包括一个完整的预处理器)。
你是对的;正则表达式甚至无法接近这一点。答案 5 :(得分:0)
只需在源上运行预处理器(cpp),即可轻松扩展宏。 模板并不那么容易,因为模板实例化发生的时间要晚得多。
答案 6 :(得分:0)
Doxygen还可以通过在配置文件中设置选项来生成详细的XML。它非常彻底,而且非常易于使用。来自doxygen home page:
XML输出包含一个 结构化的“转储”信息 由doxygen收集。每种化合物 (class / namespace / file / ...)有自己的 XML文件还有一个索引 文件名为index.xml。
名为combine.xslt XSLT脚本的文件 也生成并可用于 将所有XML文件合并为一个 文件。
Doxygen还会生成两个XML架构 files index.xsd(用于索引文件) 和compound.xsd(对于化合物 文件)。此架构文件描述了 可能的元素,它们的属性 以及它们的结构,即它 描述了XML的语法 文件,可用于验证 或者引导XSLT脚本。
在addon / doxmlparser目录中 可以找到一个解析器库供阅读 doxygen生成的XML输出 增量方式(见 附加/ doxmlparser /包含/ doxmlintf.h 对于图书馆的界面)