【问题标题】:Need a C structure parser需要一个 C 结构解析器
【发布时间】:2012-04-18 08:27:55
【问题描述】:

假设我有一个文件 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 文件或从可执行文件中获取来自 dwarf 的信息并创建类似于 DUMP_STRUCT 的函数?

【问题讨论】:

    标签: php python c parsing dwarf


    【解决方案1】:

    似乎有 Python bindings 用于 libclang,它应该能够做你想做的事。还有pycparser 项目。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          检查pstruct 的工作原理可能会有所收获。 (我认为它在 perl 中,但使用编译器 stab 调试信息来输出有关结构布局的信息)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-22
            • 1970-01-01
            • 1970-01-01
            • 2010-12-24
            • 1970-01-01
            相关资源
            最近更新 更多