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语法分析器(parser)源码阅读(三) -> 正文阅读

[游戏开发]python语法分析器(parser)源码阅读(三)

关于结构体tok_state以及结构体parser_state

这两个结构体主要出现在parsetok.c以及tokenizer.c文件中,对于这两个结构体,它们之间的关系应该是承上启下的关系即先生成tok_state然后再生成相应的parser_state.

下图是通过sizeof取得的两个结构体的大小。

可以看出,这两个结构体都比较大,再加上结构体内指针指向的地址空间,结构体包含的实际信息量要更大。其中结构体内部的具体信息在源码里都有详细描述,这里不再写。

先看一下tok_state,通过我的观察,这个主要用在PyTokenizer_Get(struct tok_state *tok, char **p_start, char **p_end)这个函数上,位于tokenizer.c文件中第1838行,通过这个函数,主要用于获取输入的字符串。然后信息通过tok_state保存下来。

这里出现了一个我一直想不通的问题,为啥tok_state使用时必须在前面加一个struct,不加就会报错。

再看一下parser_state,它集中出现在parser.c文件中,这个文件中主要的一个函数是PyParser_AddToken,通过这个函数来进行token的分析。

注意这个for循环,我思考了很久才发现,tok_stateparser_state似乎并没有特别的交集,但是,它们之间其实是通过一个char* str来产生联系的。

        type = PyTokenizer_Get(tok, &a, &b);
        //。。。。。。。省略一部分代码
        len = (a != NULL && b != NULL) ? b - a : 0;
        str = (char *) PyObject_MALLOC(len + 1);
        if (str == NULL) {
            err_ret->error = E_NOMEM;
            break;
        }
        if (len > 0)
            strncpy(str, a, len);
        str[len] = '\0';

?变量a代表的正是tok_state的前面的那个token,比如输入1+1的话,那么在一个循环中,会是这样的。

a的变化
第一次循环1
第二次循环+
第三次循环1

然后a的值赋值给str后 ,str又作为变量传给了PyParser_AddToken,然后parser_state又构建了起来。

但是看一下parsetok的返回值,它返回的是一个node指针,也就是说,parser_state作为一个整体并没有全部被返回出来,而是仅返回了它其中的一个成员变量node*,源码上的注释说它是语法分析树的顶指针,实际上就应该是parser.c中要做的事情了

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:55:47  更:2022-03-22 20:58:13 
 
开发: 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/28 9:31:17-

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