关于结构体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中要做的事情了

python语法分析器(parser)源码阅读(三)相关推荐

  1. mybatis源码阅读(三):mybatis初始化(下)mapper解析

    转载自 mybatis源码阅读(三):mybatis初始化(下)mapper解析 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单. ...

  2. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

  3. SDWebImage源码阅读(三)UIImage+GIF

    UIImage+GIF 是UIImage 类的一个GIF 分类,在之前的版本里面这个分类是用了处理GIF 动态图片的但是会有内存暴增的bug.在当前 '4.0.0-beta2' 的版本里GIF 动态图 ...

  4. Struts2源码阅读(三)_DispatcherConfigurationProvider

    首先强调一下struts2的线程程安全,在Struts2中大量采用ThreadLocal线程局部变量的方法来保证线程的安全,像Dispatcher等都是通过ThreadLocal来保存变量值,使得每个 ...

  5. SpringMVC源码阅读(三)

    先理一下Bean的初始化路线 org.springframework.beans.factory.support.AbstractBeanDefinitionReader public int loa ...

  6. redis源码阅读-zset

    前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解.(ps: 分享的文章再丰富下再放出来). 数据结构 我们先看下redis 5.0的代码.本次讲解主要是zs ...

  7. Spark源码阅读——任务提交过程

    2019独角兽企业重金招聘Python工程师标准>>> Spark 源码阅读--任务提交过程 当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者 ...

  8. redis源码阅读-持久化之RDB

    持久化介绍: redis的持久化有两种方式: rdb :可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) aof : 记录redis执行的所有写操作命令 根 ...

  9. redis源码阅读-持久化之aof与aof重写详解

    aof相关配置 aof-rewrite-incremental-fsync yes # aof 开关,默认是关闭的,改为yes表示开启 appendonly no # aof的文件名,默认 appen ...

  10. mysql 1260,MYSQL 源码阅读 六

    前期节要 MYSQL源码阅读 一 MYSQL源码阅读 二 MYSQL源码阅读 三 MYSQL 源码阅读 四 MYSQL 源码阅读 五 上次有两个问题没搞明白 1 是 为什么一定要开启调试线程 ? 因为 ...

最新文章

  1. java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法
  2. 《软件设计师》——数据结构和算法基础
  3. Python高阶函数和eval函数
  4. SpringBoot+Junt+Mock测试方法
  5. 马云还曾有过这么一段求职经历
  6. Spark修炼之道(高级篇)——Spark源码阅读:第九节 Task执行成功时的结果处理...
  7. 希尔排序java代码_希尔排序及希尔排序java代码
  8. 国产 Linux 发行版再添一员,界面不输苹果!太漂亮了。。
  9. 好看的热力图seaborn.heatmap配色
  10. latex怎么看论文字数_LaTeX | 为学术论文排版而生【公式篇】
  11. 探针台的配件也要第三方计量校准吗
  12. 开发软件需要学习什么?
  13. python进阶豆瓣青梅竹_python3 Django+MySQL
  14. Spring 揭秘之Spring AOP一世(2)织入实现
  15. WPS压力传感器测高温部件的注意事项
  16. 云栖大会人脸识别闸机【技术亮点篇5】--人脸识别闸机采用海康威视摄像头
  17. 为什么linux图形引擎那么丑,为什么你的技术文章配图总是那么丑?那是你还没看过这篇教科书般的技术文章配图指南!...
  18. AutoCAD Lisp LSP小程序 实现面积注记
  19. 杜永光为你解析脸萌为什么这么红
  20. A comparative review of tone-mapping algorithms for high dynamic range video(高动态范围视频色调映射算法的比较研究)(二)

热门文章

  1. 巴士拉银匠哈桑的故事(三)
  2. 关于BT06蓝牙通信的实现
  3. 7-51 实验9_2_身份证号码最后一位 (100 分)
  4. 出得厅堂入得厨房之王国维可以休矣(2005高考作文湖北0分卷)
  5. 达梦数据库DSC集群搭建
  6. 编写计算机软件,编写软件是一种艺术
  7. [看盘技巧]专业短线高手如何快速看盘
  8. leetcode---953. 验证外星语词典
  9. oppo锁屏断网设置在哪里呀_oppo手机不自动锁屏怎么设置怎么办
  10. 【PMP考试秘笈】第三式:情景题中有效固定答题套路