【问题标题】:How to parse a C header file?如何解析C头文件?
【发布时间】:2009-12-23 08:36:07
【问题描述】:

有谁知道在 Python 中使用 C 头文件的好方法吗?例如,我有一个包含全局变量的 C 程序:

typedef struct ImageInfo
{
    uint8_t revisionMajor;
    uint8_t revisionMinor;
    uint16_t checksum;    

} ImageInfo;

ImageInfo gImageInfo;   /* Placed at a specific address by the linker */

我希望能够获取由 C 编译器/链接器生成的二进制文件,并使用 Python 脚本解析此结构(并可能对其进行修改)。

【问题讨论】:

  • 这种结构可能在“二进制文件”中不存在——直到程序被操作系统加载到 RAM 后的执行时间,它才真正“存在”。那么你到底想做什么?
  • 哎呀我忘了提到全局变量被放置在只读(即闪存或 ROM)内存中。在上面的示例中,gImageInfo 将放置在二进制文件中的偏移量 0x1000 处,我希望能够使用 Python 读取结构并获取修订信息以验证校验和。

标签: python c


【解决方案1】:

这是昨天在 SO 上提到的;我还没有机会更彻底地检查它,但我是故意的。 pycparser,“用 Python 编写的 C 解析器和 AST 生成器”。

https://github.com/eliben/pycparser

【讨论】:

  • 虽然表面上是古老的历史,但这个答案至少值得再投 2 票——它提供了完全按照原始帖子要求进行操作的能力。
【解决方案2】:

Have a look at this C++ header parser written in Python。您还可以使用以下任何工具编写自己的解析器:

【讨论】:

  • 很好的参考资料:我不知道一堆这些模块。我想知道与 pygccxml 相比,它们的功能有多全面(显然它有 GCC 的支持)。编写 C++ 解析器非常困难(尽管问题是关于 C 解析)。如果可能的话,使用比完整的基于 GCCXML 的堆栈更轻的东西会很好。
【解决方案3】:

看看pygccxml。我用它来构建我的 C/C++ 源代码的内存图,我可以将其用作许多代码生成任务的基础。

PS:当我第一次开始使用基于 Python 的代码生成时,我实际上尝试自己编写一个解析器:为自己省去痛苦,甚至不要去那里! (看起来你已经知道了......) pygccxml 是你想要的一切,还有更多:)

【讨论】:

    【解决方案4】:

    出于同样的目的,我正在考虑pyclibrary, 它不是一个完整的 C 解析器,但它的目的是解析 C 头文件,所以它比 pycparser 或一些基于 gccxml 的解析器更容易使用:虽然文档薄弱,只需尝试CParser.py testHeader.h,你就会看到它是如何工作的.

    取决于 pyparsing,据我了解,它是纯 python。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多