需要一个C结构解析器

时间:2012-04-18 08:27:55

标签: php python c parsing dwarf

假设我有一个文件system.h,其中我有以下结构

typedef struct Foo {
  int count;
  uint32 world;
  Temp id;
} Foo;

typedef struct Temp {
  uint64 id;
} Temp;

Foo bar;

现在我需要一个像DUMP_STRUCT(bar)这样的宏,它以递归方式打印bar的所有成员(类型为Foo)。

是否有任何解析器/脚本(最好在php / python中)可以解析C文件或从可执行文件中获取矮人信息并创建类似于DUMP_STRUCT的函数?

4 个答案:

答案 0 :(得分:2)

似乎libclang有Python bindings,应该可以做你想要的。还有pycparser项目。

答案 1 :(得分:1)

如果您的C头文件包含C头文件包含的典型内容(宏,预处理器条件,包含,位字段),您将需要一个完整的C解析器来处理头文件。

GCC-XML可能会产生你需要的东西(它完全不是“C”,而是C ++),意味着将各种结构槽及其类型转储为XML文本;你必须在遍历数据结构的代码中按摩它。为此,您可能必须匹配类型声明的子结构(作为有趣形状/内容的XML子树)。

我们的DMS Software Rengineering Toolkit及其C Front End执行完整的预处理/解析/构建符号表。您可以从中生成GCC-XML的输出,但是更容易简单地自定义DMS以遍历各种符号表和AST以提取您想要的内容。匹配过程更容易,因为符号表的设计便于访问命名空间的结构,其中的符号条目以及它们的类型信息(已经设置为数据结构)。 DMS还提供表面语法模式匹配,既可以用于识别感兴趣的AST,也可以用作代码生成器来生成不会出现语法错误的代码。

答案 2 :(得分:1)

您可以使用GCCXML,它可以解析C(带有一些限制)和带有XML输出的C ++标头。

答案 3 :(得分:1)

您可以从检查pstruct的工作原理中获得一些里程。 (我认为它在perl中,但是使用编译器stab调试信息来输出有关结构布局的信息)。