IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python - C语言语法解析:pycparser模块 -> 正文阅读

[Python知识库]Python - C语言语法解析:pycparser模块

0 前言

>>返回Python系列文章目录<<

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\bin\gcc.exe', cpp_args=r'-I./fake_libc_include')
parse_file的参数说明
use_cpp是否使用本地c语言编译器预处理代码,去掉其中的#命令(头文件、宏定义、pragma)
cpp_path本地c语言编译器路径
cpp_argsfake_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类属性如下:

  • 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;
}
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:55:36  更:2022-01-14 01:57:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:16:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码