首页> 疑难解答

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

withpy 2021-06-18

简介我正在寻找一种方法来解析c ++代码以检索有关类的一些基本信息。我实际上并不需要代码本身提供太多信息,但我确实需要它来处理像宏和...这样的事情。

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

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

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

代码中的实际指令与我的目的无关。

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

5
投票

听起来像gcc-xml的工作与c ++ xml-library或你选择的xml友好的脚本语言相结合。


4
投票

另见Ira Baxter在这里,他在哪里cites his own product

警告:请注意,只有Elsa“......我听到相当不错的工作......”在构建符号表时,根据Ira Baxter的说法,OP的原始意图是必要的(请参阅对此答案的评论 - 我引用他,因为他是该领域的专家)。


4
投票

在代码上运行Doxygen会给你大部分时间,不是吗?

您想以什么格式输出?


2
投票

Exuberant Ctags将为您提供所需的大部分内容,编辑通常会使用它来提供代码导航。 可能会阻止一些模板......


2
投票

DMS Software Reengineering Toolkit是通用程序分析和转换机制。它的C++ Front End构建在DMS上,为各种常见的C ++方言提供全功能的C ++解析,可以同时处理一组C ++类,并构建您可以以任何方式使用的全名/类型/访问信息。信息被标记为精确的原始文件/行/列。 (它包括一个完整的预处理器)。

你是对的;正则表达式甚至无法接近这一点。


0
投票

只需在源上运行预处理器(cpp),即可轻松扩展宏。模板并不那么容易,因为模板实例化发生的时间要晚得多。


0
投票

Doxygen还可以通过在配置文件中设置选项来生成详细的XML。它非常彻底,而且非常易于使用。来自doxygen home page

XML输出包含由doxygen收集的信息的结构化“转储”。每个化合物(class / namespace / file / ...)都有自己的XML文件,还有一个名为index.xml的索引文件。

还生成了一个名为combine.xslt XSLT脚本的文件,该文件可用于将所有XML文件合并到一个文件中。

Doxygen还生成两个XML模式文件index.xsd(用于索引文件)和compound.xsd(用于复合文件)。此模式文件描述了可能的元素,它们的属性以及它们的结构,即它描述了XML文件的语法,可用于验证或控制XSLT脚本。

在addon / doxmlparser目录中,您可以找到一个解析器库,用于以增量方式读取doxygen生成的XML输出(有关库的接口,请参阅addon / doxmlparser / include / doxmlintf.h)

相关文章

  • 如何从浏览器意图中获取URL

    我正在尝试从网站验证用户身份。当用户点击批准或拒绝时,应用程序将获取重定向的URL,并检查它是否包含approve = true或deny = true。

  • 如何在不关闭服务的情况下更新数据库?

    我正在使用ansible来设置我的docker-swarm。在我的docker swarm中,我运行:Web服务器,数据库和缓存。我的问题是:如何在不制作数据的情况下更新我的数据库(例如码头图像等)

  • 寻址到同一页面的不同值 - PHP

    正如标题所暗示的那样,我有一个表:表的内容:id名字电子邮件密码角色和两个用户一个角色值:N和另一个角色值:S登录后,...

  • 使用nohup Standalone启动WildFly

    我想使用standalone-full.xml而不是standalone.xml启动WildFly 11。所以我必须执行命令:sh standalone.sh -c standalone-full.xml文件夹wildfly-11.0.0.Final / ...

  • python中的嵌套字典

    我正在尝试更新内部dictonary中的值,但它正在更新两者,我尝试了很多,但仍然面临同样的问题。提前致谢。 arr = [1,2] d_int = {'a':假,'e':......

  • AttributeError:'NoneType'对象没有属性'children'

    来自urllib.request导入urlopen来自bs4 import BeautifulSoup html = urlopen(“http://www.pythonscraping.com/pages/page3.html”)bsObj = BeautifulSoup(html,“html.parser”)for bsObj.find中的child (” ...