目录
pycparser 是一个用纯 Python 编写的 C 语言解析器。它是一个 模块,旨在轻松集成到需要解析 C 源代码的应用程序中。
任何需要解析 C 代码的场景。以下是 pycparser 的一些用途,来自 用户反馈:
- C 代码混淆器
- 各种专用 C 编译器的前端
- 静态代码检查器
- 自动单元测试发现
- 为 C 语言添加专用扩展
pycparser 最受欢迎的用途之一是在 cffi 库中,该库使用它来解析 C 函数和类型的声明,以自动生成 FFI。
pycparser 的独特性在于它是用纯 Python 编写的——一种非常 高级的语言,易于实验和调整。对于熟悉 Lex 和 Yacc 的人来说, pycparser 的代码将很容易理解。它也没有外部依赖项(除 Python 解释器外), 因此安装和部署非常简单。
pycparser 旨在支持完整的 C99 语言(根据标准 ISO/IEC 9899)。也支持 C11 的一些特性,欢迎提交支持更多特性的补丁。
pycparser 支持极少数 GCC 扩展,但可以相对容易地进行设置, 使其能够成功解析大量包含 GCC 风格的代码。有关更多详细信息,请参阅 FAQ。
pycparser 非常紧密地遵循 C99 标准(ISO/IEC 9899)附录 A 中提供的 C 语法。
要报告 pycparser 的问题或提交功能请求,请打开一个issue,或提交 一个 pull request。
pycparser 正在 Linux、macOS 和 Windows 上使用现代 Python 版本进行测试。 有关详细信息,请参阅CI 仪表板。
pycparser 没有外部依赖项。
安装 pycparser 的推荐方法是使用 pip:
> pip install pycparser
为了能够编译,C 代码必须经过 C 预处理器——cpp——进行预处理。
兼容的 cpp 会处理预处理指令,如 #include 和 #define,
删除注释,并执行其他一些准备 C 代码进行编译的小任务。
对于除最简单的 C 代码片段以外的所有代码,pycparser 像 C 编译器一样,
必须接收预处理后的 C 代码才能正常工作。如果您从 pycparser 包导入顶层的
parse_file 函数,它将为您与 cpp 交互,只要 cpp 在您的 PATH 中,
或者您提供了其路径。
另请注意,您可以使用 gcc -E 或 clang -E 代替 cpp。有关更多详细信息,
请参阅 using_gcc_E_libc.py 示例。Windows 用户可以从这个网站下载并安装
Clang for Windows 的二进制版本。
C 代码几乎总是 #include 标准 C 库中的各种头文件,如 stdio.h。
虽然(付出一些努力)可以使 pycparser 解析任何 C 编译器的标准头文件,
但使用 utils/fake_libc_include 中提供的 C11 的“伪”标准包含文件要简单得多。
这些是标准 C 头文件,只包含允许有效解析使用它们的文件的必需内容。
此外,由于它们是最小化的,因此可以显著提高解析大型 C 文件的性能。
这里的关键点是 pycparser 并不真正关心类型的语义。它只需要知道源中遇到的 某个标记是否是先前定义的类型。这对于能够正确解析 C 是至关重要的。
有关更多详细信息,请参阅这篇博文。
请注意,伪头文件不包含在 pip 包中,也不会通过包构建安装(#224)。
请查看分发包中的 examples 目录,其中包含一些使用 pycparser 的
示例。这些应该足以让您入门。请注意,大多数实际的 C 代码示例都需要在将代码传递给
pycparser 之前运行 C 预处理器;有关更多详细信息,请参阅前面的部分。
pycparser 的公共接口在 pycparser/c_parser.py 中的注释中得到了很好的记录。
有关解析器创建的各种 AST 节点的详细概述,请参阅 pycparser/_c_ast.cfg。
这里还有一个FAQ。 无论如何,您随时可以给我发送电子邮件寻求帮助。
在修改 pycparser 时,有几点需要注意:
- pycparser 的 AST 节点的代码是通过一个配置文件——
_c_ast.cfg——由_ast_gen.py自动生成的。如果您修改了 AST 配置,请务必重新生成代码。 这可以通过运行_ast_gen.py脚本(从存储库根目录或pycparser目录)来完成。 - 阅读
CParser类的构造函数中的文档字符串,了解配置和兼容性参数的详细信息。
解压缩 pycparser 包后,您将看到以下文件和目录:
- README.rst:
- 此 README 文件。
- LICENSE:
- pycparser 许可证
- setup.py:
- 旧的安装脚本(构建元数据位于
pyproject.toml)。 - pyproject.toml:
- 包元数据和构建配置。
- examples/:
- 一个包含一些使用 pycparser 的示例的目录
- pycparser/:
- pycparser 模块源代码。
- tests/:
- 单元测试。
- utils/fake_libc_include:
- 最小化的标准 C 库包含文件,应该允许解析任何 C 代码。
请注意,这些头文件现在包含 C11 代码,因此当预处理器配置为较早的 C 标准(如
-std=c99)时,它们可能不起作用。 - utils/internal/:
- 供我个人使用的内部实用程序。您可能不需要它们。
有些人通过报告他们发现的 bug 或提交补丁为 pycparser 做出了贡献。 贡献者列表在源代码发行版的 CONTRIBUTORS 文件中。在 pycparser 迁移到 Github 后,我停止更新此列表,因为 Github 在跟踪贡献方面做得更好。