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_state与parser_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的话,那么在一个循环中,会是这样的。
第一次循环 | 1 |
第二次循环 | + |
第三次循环 | 1 |
然后a的值赋值给str后 ,str又作为变量传给了PyParser_AddToken,然后parser_state又构建了起来。
但是看一下parsetok的返回值,它返回的是一个node指针,也就是说,parser_state作为一个整体并没有全部被返回出来,而是仅返回了它其中的一个成员变量node*,源码上的注释说它是语法分析树的顶指针,实际上就应该是parser.c中要做的事情了
python语法分析器(parser)源码阅读(三)相关推荐
- mybatis源码阅读(三):mybatis初始化(下)mapper解析
转载自 mybatis源码阅读(三):mybatis初始化(下)mapper解析 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单. ...
- 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...
- SDWebImage源码阅读(三)UIImage+GIF
UIImage+GIF 是UIImage 类的一个GIF 分类,在之前的版本里面这个分类是用了处理GIF 动态图片的但是会有内存暴增的bug.在当前 '4.0.0-beta2' 的版本里GIF 动态图 ...
- Struts2源码阅读(三)_DispatcherConfigurationProvider
首先强调一下struts2的线程程安全,在Struts2中大量采用ThreadLocal线程局部变量的方法来保证线程的安全,像Dispatcher等都是通过ThreadLocal来保存变量值,使得每个 ...
- SpringMVC源码阅读(三)
先理一下Bean的初始化路线 org.springframework.beans.factory.support.AbstractBeanDefinitionReader public int loa ...
- redis源码阅读-zset
前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解.(ps: 分享的文章再丰富下再放出来). 数据结构 我们先看下redis 5.0的代码.本次讲解主要是zs ...
- Spark源码阅读——任务提交过程
2019独角兽企业重金招聘Python工程师标准>>> Spark 源码阅读--任务提交过程 当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者 ...
- redis源码阅读-持久化之RDB
持久化介绍: redis的持久化有两种方式: rdb :可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) aof : 记录redis执行的所有写操作命令 根 ...
- redis源码阅读-持久化之aof与aof重写详解
aof相关配置 aof-rewrite-incremental-fsync yes # aof 开关,默认是关闭的,改为yes表示开启 appendonly no # aof的文件名,默认 appen ...
- mysql 1260,MYSQL 源码阅读 六
前期节要 MYSQL源码阅读 一 MYSQL源码阅读 二 MYSQL源码阅读 三 MYSQL 源码阅读 四 MYSQL 源码阅读 五 上次有两个问题没搞明白 1 是 为什么一定要开启调试线程 ? 因为 ...
最新文章
- java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法
- 《软件设计师》——数据结构和算法基础
- Python高阶函数和eval函数
- SpringBoot+Junt+Mock测试方法
- 马云还曾有过这么一段求职经历
- Spark修炼之道(高级篇)——Spark源码阅读:第九节 Task执行成功时的结果处理...
- 希尔排序java代码_希尔排序及希尔排序java代码
- 国产 Linux 发行版再添一员,界面不输苹果!太漂亮了。。
- 好看的热力图seaborn.heatmap配色
- latex怎么看论文字数_LaTeX | 为学术论文排版而生【公式篇】
- 探针台的配件也要第三方计量校准吗
- 开发软件需要学习什么?
- python进阶豆瓣青梅竹_python3 Django+MySQL
- Spring 揭秘之Spring AOP一世(2)织入实现
- WPS压力传感器测高温部件的注意事项
- 云栖大会人脸识别闸机【技术亮点篇5】--人脸识别闸机采用海康威视摄像头
- 为什么linux图形引擎那么丑,为什么你的技术文章配图总是那么丑?那是你还没看过这篇教科书般的技术文章配图指南!...
- AutoCAD Lisp LSP小程序 实现面积注记
- 杜永光为你解析脸萌为什么这么红
- A comparative review of tone-mapping algorithms for high dynamic range video(高动态范围视频色调映射算法的比较研究)(二)