Python-C语言语法解析:pycparser模块
Python-C语言语法解析:pycparser模块
- 0 前言
- 1 pycparser模块(三方库)
- 1.1 方法列表
- 1.2 语法树组成
- 1.2.1 数据类型定义 Typedef
- 1.2.1.1 类型声明 TypeDecl
- 1.2.1.1.1 标识符类型 IdentifierType
- 1.2.2 变量声明 Decl
- 1.2.2.1 常量 Constant
- 1.2.3 函数定义 FuncDef
- 1.2.4 函数声明 FuncDecl
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_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类属性如下:
- 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-C语言语法解析:pycparser模块相关推荐
- 偷学Python第三十一天:Python正则表达式的语法以及re模块的使用
偷学Python第三十一天:Python正则表达式的语法以及re模块的使用 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 文章目录 偷学Python第三十一天:Python正则表达式的语 ...
- 黑马程序员—(iOS开发)C语言语法解析---(三)
------- iOS培训.PHP培训.android培训.java培训.期待与您交流! ---------- 了解: 1.关键字.标识符.注释: 2.常量.变量 3.进制 4.变量与内存 5.基本数 ...
- python argparse(参数解析)模块学习(二)
转载自:http://www.cnblogs.com/fireflow/p/4841389.html(我去..没转载功能,ctrl + c 和 ctrl + v 得来的,格式有点问题,可去原版看看) ...
- 【Python】Python脚本命令行解析
Python脚本命令行解析 argparse 模块 使用 argparse 模块可以方便的编写出友好的命令行接口.程序定义需要的参数,然后 argparse 将从sys.argv解析出那些参数.arg ...
- python中的正则表达式语法_Python基础教程之正则表达式基本语法以及re模块
什么是正则: 正则表达式是可以匹配文本片段的模式. 正则表达式'Python'可以匹配'python' 正则是个很牛逼的东西,python中当然也不会缺少. 所以今天的Python就跟大家一起讨论一下 ...
- Python命令行参数解析模块getopt使用实例
这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...
- 利用python爬虫(part16)--json解析模块
学习笔记 json解析模块 json.loads 作用 把json格式的字符串转为Python数据类型. 语法 res = requests.get(url=url, headers=headers) ...
- Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...
Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...
- python语言的读法-就语法而言,Python 这个语言怎么样?
Python的特点是语法简洁,如果是有过其他编程语言经验的朋友,对其他语言的语法会比较熟悉,初次接触Python可能会不太适应,不过随着Python语言的使用会逐步体会到这一点. Python有两个外 ...
- go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...
1 基础 HTML解析:定位基础是xpath,了解下面的链接的基本知识. 在python中使用HTML解析等操作时,需要安装lxml包,在pycharm的terminal下:pip install l ...
最新文章
- Mongodb的update操作
- 【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends
- 你写的代码扩展性高吗?快试试用Spring注入方式来解耦代码!
- XML解析模型(完整版)
- -离散数学-期末练习题解析
- c++笔记17之句柄类
- java毕业设计——基于java+JSP+MySQL的网上订餐管理系统设计与实现(毕业论文+程序源码)——网上订餐管理系统
- 学习笔记:AGPS-SUPL架构
- linux下mysql免安装_linux下免安装版本mysql5.5 配置
- Shifterator库 | 词移图分辨两文本用词风格差异
- 虚拟机几种联网的方式,如何共享主机IP
- ElasticSearch之elasticsearch-users用法及修改集群密码
- MyBatis中jdbc和managed的区别
- SQL中destinct的用法
- HTML5—网页三兄弟
- 程序猿真的觉得写代码比女朋友重要吗?
- baidu 百度在搞什么啊?
- 2.5.Airborne Topographic Laser Scanners 机载地形激光扫描仪
- 智能时代,三步让自己不再焦虑
- 【android精品源码系列】安卓线上购物商城
热门文章
- java关键字 final static
- Linux多线程编程详细解析----条件变量 pthread_cond_t
- 为了实现搜索引擎功能,将正则进行到底!
- Face++ AI换脸
- 基于TensorFlow实现自定义层的项目代码
- SIP - FreeSwitch 安装 编译
- 将GRUB输出重定向到串口
- 【开发日志】gtest踩坑:-1: error: cannot find -llibgtest
- 浅谈Tomcat接收到一个请求后在其内部的执行流程(源码)
- 帮忙做c语言作业,c语言..题目.帮忙做一下