【问题标题】:Parsing C header files to extract information about data types, functions and function arguments解析 C 头文件以提取有关数据类型、函数和函数参数的信息
【发布时间】:2011-10-04 03:04:23
【问题描述】:

我有一个 C 头文件。我想解析它并提取有关数据类型、函数和函数参数的信息。谁能帮我?我需要一些 C 语言的例子。

非常感谢。

【问题讨论】:

标签: c parsing header-files


【解决方案1】:

如果您需要人类可读的输出(例如 html 或 PDF),那么您可以使用 doxygene/doxywizard。在 doxywizard 中必须选择“所有实体”。

【讨论】:

    【解决方案2】:

    还有srcml。 与 c2xml 类似,它直接使用源代码。 c2xml 从预处理器输出开始。 假设良好的 C 编码规则(与任意使用预处理相反)这对我的重新设计任务来说是一个优势,因为它保留了 #defines 的名称并能够以特定方式处理选定的宏。

    【讨论】:

      【解决方案3】:

      使用ANTLR。已经为您编写了一个不错的grammar for C,ANTLR 将生成 C 代码(或者如果您愿意,也可以生成一些 other languages),然后您可以遍历这些代码以获得您想要的。

      【讨论】:

      • +1 通常用于解析器生成器,我从未使用过 ANTLR,但 Lex + Yacc(或等效:Flex + Bison)对我很有用
      • 我在生产中的两个或三个项目中使用过 ANTLR(虽然是 v2,而不是 v3)。非常好。
      • A 解析器不会提取类型信息。您需要为此实现符号表支持。实际上,您也必须运行预处理器。所以一个 ANTLR 语法本身不会帮助你。可能存在解析和构建符号表的 ANTLR 语法;我不是特别熟悉。
      • ...这个答案中引用的特定C语法说它只跟踪类型定义名称,即它不做符号表构造,更不用说类型分析了。
      • @RadLexus:感谢您的注意——我已经修复了链接。
      【解决方案4】:

      还有一个选择是使用“sparse”中的 c2xml 工具。它的 C 解析器不是 100% 符合标准的(例如,它不会解析 K&R 风格的声明),但对于相当现代的 C 代码,它工作得很好。

      【讨论】:

        【解决方案5】:

        DMS Software Reengineering Toolkit 及其C Front End 可以做到这一点。

        DMS 提供通用解析、符号表构建、流分析和program transformations,由语言定义参数化。使用 DMS 的 C 前端,DMS 将解析各种 C 方言中的任何一种,为代码元素构建 AST,构建完整的符号表,对所有符号进行完整的名称和类型解析(包括函数头中的参数列表);你可以停下来把它们扔掉。 DMS还可以对C代码进行控制和数据流分析;您可以使用其他 DMS 工具来进一步分析或转换代码。 (C 前端内置了完整的 C 预处理器)。

        EDG front end 也可用于解析和符号表,但不具备 DMS 的其他功能。

        【讨论】:

          【解决方案6】:

          你可以试试Clang。在特别The Lexer and Preprocessor Library.

          【讨论】:

          • 最近,由于一些奇怪的原因,Clang 最重要和最有用的特性,即它的 XML 打印机,被删除了。但是仍然可以使用旧版本的 Clang,或者将删除的补丁重新应用到当前版本。
          • @SK-logic 为什么 XML 打印机是最重要和最有用的功能?它被删除是因为使用它通常比直接 API 调用慢(你正在解析一个文件,生成一个 AST,用一种语言重新解析 AST,XML,解析很慢,然后 then i> 对其进行操作)。
          • @kirbyfan64sos,因为当时不存在可用的libclang
          猜你喜欢
          • 2016-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多