pycparser 的中文教程
介绍
这是一个用python写的针对c语言的解析器(parser),比较轻量级,主要用于集成至需要解析C语言的应用。以下是一些pycparser可能的用途:
- C代码混淆器
- 各种c编译器的前端
- 静态分析工具
- 自动化单元测试生成工具
- 为c语言添加新扩展
pycparser是用纯python编写的,除了python解释器外无需其他依赖。
pycparser的目标是完全支持C99标准(ISO/IEC 9899),也支持部分C11的特性。
pycparser用BSD License
如有问题,请在pycparser的issue页面或提交pull request。
安装
前置条件
- pycparser已在Windows和Linux上的python2.7、3.3-3.6测试通过。
- pycparser无需其他依赖,它唯一使用的非标准库是PLY,但PLY已集成到了
pycparser/ply
中,当前PLY版本是3.10,PLY主页为http://www.dabeaz.com/ply/
安装步骤
下载pycparser压缩包并解压后运行python setup.py install
即可。
或者,pycparser在PyPI列表中,你可以使用pip安装pycparser,运行pip install pycparser
即可。
使用pycparser
预处理
为了能够正确编译,C代码必须事先被C预处理器(C preprocessor, cpp)
预处理,cpp
处理如#include
、#define
之类的预处理指令、去除注释以及进行其他操作,准备C代码以进行编译。
pycparser必须接收预处理过的C代码,如果你从上层pycparser包导入(import
)parse_file
方法,程序将自动为你调用cpp
(只要cpp
在你的PATH
中),或者你可以提供预处理器的路径。
注意,你也可以用gcc -E
或者clang -E
来代替cpp
,请查看using_gcc_E_libc.py
中的例子。
C标准头文件
C代码中几乎都有#include
语句用于包含标准C库中的头文件,如stdio.h
等。相比于用pycparser解析标准C库中的头文件,一个更简单的方法是给pycparser提供utils/fake_libc_include
里“假的”(fake)标准头文件。这些假的头文件仅仅包含了需要用于解析的东西。另外,这样可以提高解析的速度。
具体细节将在下文展开。
基本使用
在examples目录中列出了一些pycparser的基本使用方法。
注意,在解析实际C语言项目前要将其进行预处理。
下面展示一些基础用法:
使用
gcc -E
指令预处理12345678from pycparser import parse_fileif __name__ == "__main__":filename = 'path/to/file.c'ast = parse_file(filename, use_cpp=True,cpp_path='gcc',cpp_args=['-E', r'-Iutils/fake_libc_include'])ast.show()
a
12
高级使用
已将pycparser的主要接口文档注释在了pycparser/c_parser.py
中,详细将在下文展开。