Python-C语⾔语法解析:pycparser模块
Python - C语⾔语法解析:pycparser模块
0 前⾔
pycparser是python的⼀个⽤于解析C语⾔的第三⽅库,⽤于获取C语⾔的语法树
1 pycparser模块(三⽅库)
argparse模块是Python的第三⽅库,需要安装
pip install pycparser
pycparser模块导⼊⽅式
# parser_file ⽤于处理c语⾔⽂件
from pycparser import parse_file
from pycparser import CParser
# c语⾔有错误时,会引出此错误
from pycparser.plyparser import ParseError
# c_ast.py ⽂件下包含了抽象语法树的节点类
from pycparser.c_ast import*
1.1 ⽅法列表
① 使⽤以下⽅法从c⽂件创建parser类:
ast = parse_file(filename, use_cpp =False)
# fake_libc_include⽂件夹放在处理的c语⾔⽬录下
ast = parse_file(filename, use_cpp =True, cpp_path=r'C:\MinGW\', cpp_args=r'-I./fake_libc_include')
parse_file的参数说明
use_cpp是否使⽤本地c语⾔编译器预处理代码,去掉其中的#命令(头⽂件、宏定义、pragma)
cpp_path本地c语⾔编译器路径
cpp_args fake_libc_include⽂件夹路径,use_cpp=True时使⽤,需要从官⽹下载
获取c语⾔⽂件的抽象语法树ast,如果要处理#include语句,需要下载fake_libc_include⽂件夹,让编译器预处理常⽤的⽅法(添加其到代码的抽象语法树中)
parser_file() ⽅法也可以设置use_cpp=False,不⽤本地的c语⾔编译器预处理代码,就能输出抽象语法树。
② 使⽤以下⽅法从字符串创建parser类:
# 读取的⽂本序列,需去除#include #define这类语句才能⽣成AST
with open(filename, encoding='utf-8)as f:
txt = f.read()
ast = CParser().parse(txt)
1.2 语法树组成
创建语法树后得到根⽬录类型 FileAST,FileAST类属性如下:
< = [Node](下级节点列表)
FileAST下级节点组成的列表,FileAST下级节点只有3种可能:
Typedef:typedef数据类型定义
Decl:变量声明
FuncDef:函数声明
例如:
[0])
if([0])is Decl):
1.2.1 数据类型定义 Typedef
Typedef 节点以typedef语句的定义对象 uint8为中⼼
typedef int uint8;
Typedef.name ='uint8'
数据类型定义 Typedef 属性如下:
self.name = str (typedef定义对象)
self.quals = [str] (限定符号列表: const, volatile)
self.storage = [str] (存储说明符列表: extern, register, etc.)
1.2.1.1 类型声明 TypeDecl
typedef int uint8;
TypeDecl = pe
TypeDecl.name ='uint8'
Typedef 的下⼀级 类型声明 TypeDecl 是以typedef语句格式为中⼼
类型声明 TypeDecl 属性如下:
self.name = str (typedef定义对象)
self.quals = [str] (限定符号列表: const, volatile)
self.storage = [str] (存储说明符列表: extern, register, etc.)
1.2.1.1.1 标识符类型 IdentifierType
typedef int uint8;
TypeDecl = pe
IdentifierType = pe
IdentifierType.names =['int']
TypeDecl 的下⼀级 标识符类型 IdentifierType 是简单标识符,⽐如void, char定义之类
标识符类型 IdentifierType 属性如下:
self.name = [str] (标识符字符串列表)
1.2.2 变量声明 Decl
uint8 a =0;
Decl.name ='a'
Decl.quals =['const','volatile']
变量声明 Decl 属性如下:
self.name = str (被声明的变量名)
self.quals = [str] (限定符号列表: const, volatile)
self.storage = [str] (存储说明符列表: extern, register, etc.)self.funcspec = [str] (函数说明符列表: C99的inline)
self.init = Node (初始化值,Constant节点)
self.bitsize = Node (位域bit field⼤⼩,或者为None)
1.2.2.1 常量 Constant
常量 Constant 属性如下:
self.value= str (数值)
1.2.3 函数定义 FuncDef
FuncDef ⽅法定义,不同于 FuncDecl,有具体的函数实现过程
int test(uint8 b)
{
b =0;
return b;
}
函数定义 FuncDef 属性如下:
self.decl = Node (⼀般是包含FuncDecl的Decl节点)
self.body = Node (函数实现的代码块)
c语言编译器的功能d= str(标识符字符串所在⾏列)
1.2.4 函数声明 FuncDecl
FuncDecl既可以单独存在,也可以是函数定义的⼀部分
int test(uint8 b)
{
b =0;
return b;
}