pycparser使用教程

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语言项目前要将其进行预处理。

下面展示一些基础用法:

  1. 使用gcc -E指令预处理

    1
    2
    3
    4
    5
    6
    7
    8
    from pycparser import parse_file
    if __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()

  2. a

    1
    2

高级使用

已将pycparser的主要接口文档注释在了pycparser/c_parser.py中,详细将在下文展开。