哪些库可用于解析c ++以提取类型信息

时间:2009-10-05 15:20:26

标签: c++ parsing types

我正在寻找一种方法来解析c ++代码以检索有关类的一些基本信息。我实际上并不需要代码本身的大量信息,但我确实需要它来处理宏和模板之类的东西。简而言之,我想提取代码的“结构”,你将在UML图中显示。

对于代码库中的每个类/ struct / union / enum / typedef,我需要的所有内容(在处理模板和宏之后)是:

  • 他们的名字
  • 他们居住的名称空间
  • 包含的字段(类型名称,字段名称和访问限制,例如private / mutable / etc)
  • (返回类型,名称,参数)中包含的函数
  • 声明文件
  • 此数据定义开始的行/列号(或文件中的字节偏移量)

代码中的实际说明与我的目的无关。

我期待很多人说我应该使用正则表达式(甚至是Flex&amp; Bison),但这些并不是真正有效的,因为我需要正确处理预处理器和模板。< / p>

7 个答案:

答案 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   对于图书馆的界面)