python语法分析图_Python的抽象语法树(二)
Python的抽象语法树(二)
在之前的Python 的抽象语法树(一),我们阐述了一个字符串表达式是如何按照Python的文法定义生成对应的抽象语法书的。
今天我们就借助一个简单的小例子,来感受下Python生成抽象语法书的具体过程:
k = 5
print k
这个例子的词法分析过程在之前的文章已经分析过,读者可自行查阅。
从Token到CST
Python的语法解析相关代码依然是在parsetok,整个程序的逻辑大致如下:
一个循环,不断解析输入的字符串
从字符串中解析初对应的Token
每解析出一个Token,就通过PyParse_AddToken进入CST的创建过程。
这里有两点是需要特别注意的: 在Python中词法分析并不是全部做完再进入词法分析环节。
词法分析默认衔接的是CST
那什么是CST呢?就是与抽象语法书对应的具体语法树。为什么要有这两者之分呢?
读者朋友可以回忆下在上一篇语法分析我曾经画的两幅图:
在具体语法树中, 树的内部节点表示非终结符, 叶子节点全部为终结符, 这些终结符构成了可以对应的产生式推导出来的输入串,就是我们之前看到的Grammer文件。
抽象语法树AST是一种数据结构, 在表达式的AST中, 每个节点代表一个操作符, 而内部节点的子节点代表该操作符的操作数.
对比AST和CST可知, AST省略了很多出现在CST中的辅助符号, 这使得AST显得更简洁, 在编译器实现语法分析时, 处理AST显得更高效。
CST的具体定义
CST的解析其实本质上和我们之前分析的语法书构建没有本质区别,表征树节点的结构叫做node,定义如下:
typedef struct _node {
short n_type;
char *n_str;
int n_lineno;
int n_col_offset;
int n_nchildren;
struct _node *n_child;
} node;
n_type,节点种类
n_str,节点如果是字符串之类的,保留的字符串内容
n_lineno,所在行号
n_col_offset,所在列
n_nchildren,子节点个数
n_child,子节点数组
其实从这个数据结构中,我们就能看出,根节点node已经自发形成了一棵树的结构,如果对此有怀疑的话,我们可以参考PyNode_ListTree,自行解析CST的数据结构:
static void
list1node(FILE *fp, node *n)
{
if (n == 0)
return;
if (ISNONTERMINAL(TYPE(n))) {
int i;
for (i = 0; i < NCH(n); i++)
list1node(fp, CHILD(n, i));
}
else if (ISTERMINAL(TYPE(n))) {
switch (TYPE(n)) {
case INDENT:
++level;
break;
python语法分析图_Python的抽象语法树(二)相关推荐
- python 抽象语法树_Python 的抽象语法树(一)
Python的抽象语法树(一) 之前三章的内容,我们分别谈及了语法分析中涉及到的文法定义.文法分析以及消除左递归等内容. 今天我们来谈谈语法分析的另一大部分内容:抽象语法树. 抽象语法树 简单来说,抽 ...
- python语法学习_Python学习1——语法
Python语法包括了行.缩进.注释.标识符.保留关键字等方面. 打印语句: >>> print('hello,world!') hello,world! 输入语句: >> ...
- python基础语法类型_Python基础入门语法和变量类型(一)
1 基础语法 标识符 标识符由字母.数字和下划线(_)组成,其中不能以数字开头,并且区分大小写. 以下划线开头的标识符是有特殊意义的: 单下划线开头的如 _foo,表示不能直接访问的类属性,需要通过类 ...
- python eval函数_Python基础元素语法总结
一.程序的格式框架 1.缩进 缩进是指每行语句前的空白区域,用来表示Python程序间的包含和层次关系. 一般语句不需要缩进,顶行书写且不留空白. 当表示分支.循环.函数.类等含义,在if,while ...
- 学简单python好学吗_python好学吗语法简单吗举个例子
pythonPython (发音:[ 'paiθ()n; (US) 'paiθn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的 ...
- python 连续不等式_python 连续不等式语法糖实例
通常在多个不等式的时候,需要分着写,比如 x = 1 if x>0 and x<3: print(True) 但是在Python中居然可以连着一起写, x = 1 if 0 print(T ...
- python字典均值_Python常用基础语法(函数)汇总
重点( 要求 ): 1.理解语法( 函数 )的作用. 2.理解语法( 函数 )运用举例的代码块. 一.修改字符串(针对英文字符串)大小写. (1)title() : 将字符串(英文)开头字母装换为大写 ...
- python在冒号处显示语法错误_python冒号错误语法无效
问题1 看看错误:File "", line 3 def__init__(self,name): ^ SyntaxError: invalid syntax 在def和__init ...
- python的语法结构_Python特点、语法结构、编码知识
Python是一种静态强类型解释型高级语言.静态强类型类型是指数据类型指定后不能随意改动,但可以指定改动:解释型与编译型相对应,后者先将整段断码编译成机器码再执行,前者是边编译边执行,后者速度比前者快 ...
- python语法参数_python默认参数语法
我刚刚用python为一个用pygame编写的游戏编写了一个小的文本类,由于某些原因,我的默认参数不起作用.我试着查看python文档,看看这是否能让我知道我做错了什么,但我没有完全了解文档中的语言. ...
最新文章
- R 变量名开头不能为数字
- sh里的变量 $0 $1 $$ $#
- python struct 官方文档
- C# 网站静态页面生成器 for 多线程版
- 点击率预估又有新花样?
- android 手机内存uri_android 的各种目录详解
- 繁忙的都市(信息学奥赛一本通-T1392)
- 6.1bash编程入门值变量类型、for循环和算术运算
- 程序员之路(一年有感)
- Ubuntu中配置虚拟专用网络***
- Protues 8.8 SP1 无需破解 可用直装版 指路
- WEB项目优化:雅虎优化网站的34条法则(转)
- 【062】百度识图-以图搜图,查找图源及相似图
- vc word bookmark
- SAP 物料号系统内部编码导入BAPI报错(E M_ 17)
- [C语言编程练习][17]假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?
- 论文盲审环节,怎么审?
- UCML-领先的B/S应用快速开发工具,基于组件重用和应用框架重用,支持.NET体系,直接生成C#源码;
- 北京工作居住证续签收紧_收紧网站的安全带:HTTP安全标题
- 2014 北京、西安邀请赛
热门文章
- batch script learn
- 论文笔记:Multilingual Multimodal Pre-training for Zero-Shot Cross-Lingual Transfer of Vision-Language Mo
- 《程序员代码面试指南》第一章:栈与队列
- tcs标准编写软件_tcs2010(中国标准编写模板)免费版
- cuda cudnn 下载地址
- R语言安装包失败方案及DataExplorer包安装方法实践
- 数学建模18年美赛题目中英文
- ztree 自定义参数_ztree的自定义编辑
- csdn资源下载不了问题解决 360浏览器下载不了csdn资源问题解决
- linux上实现getch()函数