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模块相关推荐

  1. 偷学Python第三十一天:Python正则表达式的语法以及re模块的使用

    偷学Python第三十一天:Python正则表达式的语法以及re模块的使用 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 文章目录 偷学Python第三十一天:Python正则表达式的语 ...

  2. 黑马程序员—(iOS开发)C语言语法解析---(三)

    ------- iOS培训.PHP培训.android培训.java培训.期待与您交流! ---------- 了解: 1.关键字.标识符.注释: 2.常量.变量 3.进制 4.变量与内存 5.基本数 ...

  3. python argparse(参数解析)模块学习(二)

    转载自:http://www.cnblogs.com/fireflow/p/4841389.html(我去..没转载功能,ctrl + c 和 ctrl + v 得来的,格式有点问题,可去原版看看) ...

  4. 【Python】Python脚本命令行解析

    Python脚本命令行解析 argparse 模块 使用 argparse 模块可以方便的编写出友好的命令行接口.程序定义需要的参数,然后 argparse 将从sys.argv解析出那些参数.arg ...

  5. python中的正则表达式语法_Python基础教程之正则表达式基本语法以及re模块

    什么是正则: 正则表达式是可以匹配文本片段的模式. 正则表达式'Python'可以匹配'python' 正则是个很牛逼的东西,python中当然也不会缺少. 所以今天的Python就跟大家一起讨论一下 ...

  6. Python命令行参数解析模块getopt使用实例

    这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...

  7. 利用python爬虫(part16)--json解析模块

    学习笔记 json解析模块 json.loads 作用 把json格式的字符串转为Python数据类型. 语法 res = requests.get(url=url, headers=headers) ...

  8. 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 ...

  9. python语言的读法-就语法而言,Python 这个语言怎么样?

    Python的特点是语法简洁,如果是有过其他编程语言经验的朋友,对其他语言的语法会比较熟悉,初次接触Python可能会不太适应,不过随着Python语言的使用会逐步体会到这一点. Python有两个外 ...

  10. go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...

    1 基础 HTML解析:定位基础是xpath,了解下面的链接的基本知识. 在python中使用HTML解析等操作时,需要安装lxml包,在pycharm的terminal下:pip install l ...

最新文章

  1. Mongodb的update操作
  2. 【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends
  3. 你写的代码扩展性高吗?快试试用Spring注入方式来解耦代码!
  4. XML解析模型(完整版)
  5. -离散数学-期末练习题解析
  6. c++笔记17之句柄类
  7. java毕业设计——基于java+JSP+MySQL的网上订餐管理系统设计与实现(毕业论文+程序源码)——网上订餐管理系统
  8. 学习笔记:AGPS-SUPL架构
  9. linux下mysql免安装_linux下免安装版本mysql5.5 配置
  10. Shifterator库 | 词移图分辨两文本用词风格差异
  11. 虚拟机几种联网的方式,如何共享主机IP
  12. ElasticSearch之elasticsearch-users用法及修改集群密码
  13. MyBatis中jdbc和managed的区别
  14. SQL中destinct的用法
  15. HTML5—网页三兄弟
  16. 程序猿真的觉得写代码比女朋友重要吗?
  17. baidu 百度在搞什么啊?
  18. 2.5.Airborne Topographic Laser Scanners 机载地形激光扫描仪
  19. 智能时代,三步让自己不再焦虑
  20. 【android精品源码系列】安卓线上购物商城

热门文章

  1. java关键字 final static
  2. Linux多线程编程详细解析----条件变量 pthread_cond_t
  3. 为了实现搜索引擎功能,将正则进行到底!
  4. Face++ AI换脸
  5. 基于TensorFlow实现自定义层的项目代码
  6. SIP - FreeSwitch 安装 编译
  7. 将GRUB输出重定向到串口
  8. 【开发日志】gtest踩坑:-1: error: cannot find -llibgtest
  9. 浅谈Tomcat接收到一个请求后在其内部的执行流程(源码)
  10. 帮忙做c语言作业,c语言..题目.帮忙做一下