Python - C语言语法解析:pycparser模块
0 前言
>>返回Python系列文章目录<<
pycparser是python的一个用于解析C语言的第三方库,用于获取C语言的语法树
1 pycparser模块(三方库)
argparse模块是Python的第三方库,需要安装
pip install pycparser
pycparser模块导入方式
from pycparser import parse_file
from pycparser import CParser
from pycparser.plyparser import ParseError
from pycparser.c_ast import *
1.1 方法列表
① 使用以下方法从c文件创建parser类:
ast = parse_file(filename, use_cpp = False)
ast = parse_file(filename, use_cpp = True, cpp_path=r'C:\MinGW\bin\gcc.exe', 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类:
with open(filename, encoding='utf-8) as f:
txt = f.read()
ast = CParser().parse(txt)
1.2 语法树组成
创建语法树后得到根目录类型 FileAST,FileAST类属性如下:
- self.ext = [Node](下级节点列表)
FileAST下级节点组成的列表,FileAST下级节点只有3种可能:
- Typedef:typedef数据类型定义
- Decl:变量声明
- FuncDef:函数声明
例如:
print(ast.ext[0])
if(type(ast.ext[0]) is Decl):
1.2.1 数据类型定义 Typedef
Typedef 节点以typedef语句的定义对象 uint8 为中心
typedef int uint8;
Typedef.name = 'uint8'
Typedef.coord = ':1:13'
数据类型定义 Typedef 属性如下:
- self.name = str (typedef定义对象)
- self.quals = [str] (限定符号列表: const, volatile)
- self.storage = [str] (存储说明符列表: extern, register, etc.)
- self.type = Node (TypeDecl节点)
- self.coord= str(定义对象所在行列)
1.2.1.1 类型声明 TypeDecl
typedef int uint8;
TypeDecl = Typedef.type
TypeDecl.name = 'uint8'
TypeDecl.coord = ':1:13'
Typedef 的下一级 类型声明 TypeDecl 是以typedef语句格式为中心
类型声明 TypeDecl 属性如下:
- self.name = str (typedef定义对象)
- self.quals = [str] (限定符号列表: const, volatile)
- self.storage = [str] (存储说明符列表: extern, register, etc.)
- self.type = Node ( IdentifierType节点)
- self.coord= str(定义对象所在行列)
1.2.1.1.1 标识符类型 IdentifierType
typedef int uint8;
TypeDecl = Typedef.type
IdentifierType = TypeDecl.type
IdentifierType.names = ['int']
IdentifierType.coord = ':1:9'
TypeDecl 的下一级 标识符类型 IdentifierType 是简单标识符,比如void, char定义之类
标识符类型 IdentifierType 属性如下: self.name = [str] (标识符字符串列表)
- self.coord= str(标识符字符串所在行列)
1.2.2 变量声明 Decl
uint8 a = 0;
Decl.name = 'a'
Decl.quals = ['const', 'volatile']
Decl.coord = ':5:22'
变量声明 Decl 属性如下:
- self.name = str (被声明的变量名)
- self.quals = [str] (限定符号列表: const, volatile)
- self.storage = [str] (存储说明符列表: extern, register, etc.)
- self.funcspec = [str] (函数说明符列表: C99的inline)
- self.type = Node (TypeDecl节点)
- self.init = Node (初始化值,Constant节点)
- self.bitsize = Node (位域bit field大小,或者为None)
1.2.2.1 常量 Constant
常量 Constant 属性如下:
- self.type= str (基本数据类型,int等)
- self.value= str (数值)
- self.coord= str(标识符字符串所在行列)
1.2.3 函数定义 FuncDef
FuncDef 方法定义,不同于 FuncDecl,有具体的函数实现过程
int test(uint8 b)
{
b = 0;
return b;
}
函数定义 FuncDef 属性如下:
- self.decl = Node (一般是包含FuncDecl的Decl节点)
- self.body = Node (函数实现的代码块)
- self.coord= str(标识符字符串所在行列)
1.2.4 函数声明 FuncDecl
FuncDecl既可以单独存在,也可以是函数定义的一部分
int test(uint8 b)
{
b = 0;
return b;
}
|