Python-C语言语法解析:pycparr模块

更新时间:2023-07-28 13:16:30 阅读: 评论:0

Python-C语⾔语法解析:pycparr模块
Python - C语⾔语法解析:pycparr模块
谨慎>椰子营养价值
0 前⾔
pycparr是python的⼀个⽤于解析C语⾔的第三⽅库,⽤于获取C语⾔的语法树
1 pycparr模块(三⽅库)
argpar模块是Python的第三⽅库,需要安装
pip install pycparr
pycparr模块导⼊⽅式
# parr_file ⽤于处理c语⾔⽂件
from pycparr import par_file
from pycparr import CParr
# c语⾔有错误时,会引出此错误
from pycparr.plyparr import ParError
# c_ast.py ⽂件下包含了抽象语法树的节点类
from pycparr.c_ast import*
1.1 ⽅法列表
① 使⽤以下⽅法从c⽂件创建parr类:
核的组词ast = par_file(filename, u_cpp =Fal)
# fake_libc_include⽂件夹放在处理的c语⾔⽬录下
ast = par_file(filename, u_cpp =True, cpp_path=r'C:\MinGW\', cpp_args=r'-I./fake_libc_include')
par_file的参数说明
u_cpp是否使⽤本地c语⾔编译器预处理代码,去掉其中的#命令(头⽂件、宏定义、pragma)
cpp_path本地c语⾔编译器路径
cpp_args fake_libc_include⽂件夹路径,u_cpp=True时使⽤,需要从官⽹下载
获取c语⾔⽂件的抽象语法树ast,如果要处理#include语句,需要下载fake_libc_include⽂件夹,让编译器预处理常⽤的⽅法(添加其到代码的抽象语法树中)
parr_file() ⽅法也可以设置u_cpp=Fal,不⽤本地的c语⾔编译器预处理代码,就能输出抽象语法树。
② 使⽤以下⽅法从字符串创建parr类:
# 读取的⽂本序列,需去除#include #define这类语句才能⽣成AST
with open(filename, encoding='utf-8)as f:
txt = f.read()
ast = CParr().par(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 属性如下:
lf.name = str (typedef定义对象)
lf.quals = [str] (限定符号列表: const, volatile)
lf.storage = [str] (存储说明符列表: extern, register, etc.)
巴山夜雨涨秋池打一字
1.2.1.1 类型声明 TypeDecl
typedef int uint8;
TypeDecl = pe
TypeDecl.name ='uint8'
Typedef 的下⼀级 类型声明 TypeDecl 是以typedef语句格式为中⼼
类型声明 TypeDecl 属性如下:
lf.name = str (typedef定义对象)
lf.quals = [str] (限定符号列表: const, volatile)
lf.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 属性如下:
lf.name = [str] (标识符字符串列表)
1.2.2 变量声明 Decl
uint8 a =0;
Decl.name ='a'
Decl.quals =['const','volatile']
变量声明 Decl 属性如下:
lf.name = str (被声明的变量名)
lf.quals = [str] (限定符号列表: const, volatile)
lf.storage = [str] (存储说明符列表: extern, register, etc.)lf.funcspec = [str] (函数说明符列表: C99的inline)
lf.init = Node (初始化值,Constant节点)
lf.bitsize = Node (位域bit field⼤⼩,或者为None)
1.2.2.1 常量 Constant
常量 Constant 属性如下:
lf.value= str (数值)
1.2.3 函数定义 FuncDef
FuncDef ⽅法定义,不同于 FuncDecl,有具体的函数实现过程
int test(uint8 b)
{
b =0;
return b;
}
函数定义 FuncDef 属性如下:
lf.decl = Node (⼀般是包含FuncDecl的Decl节点)
lf.body = Node (函数实现的代码块)
鲫鱼做汤
1.2.4 函数声明 FuncDecl
FuncDecl既可以单独存在,也可以是函数定义的⼀部分
int test(uint8 b)
{
b =0;
return b;
}

本文发布于:2023-07-28 13:16:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1099887.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:模具英语
标签:定义   语法   列表   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图