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的抽象语法树(二)相关推荐

  1. python 抽象语法树_Python 的抽象语法树(一)

    Python的抽象语法树(一) 之前三章的内容,我们分别谈及了语法分析中涉及到的文法定义.文法分析以及消除左递归等内容. 今天我们来谈谈语法分析的另一大部分内容:抽象语法树. 抽象语法树 简单来说,抽 ...

  2. python语法学习_Python学习1——语法

    Python语法包括了行.缩进.注释.标识符.保留关键字等方面. 打印语句: >>> print('hello,world!') hello,world! 输入语句: >> ...

  3. python基础语法类型_Python基础入门语法和变量类型(一)

    1 基础语法 标识符 标识符由字母.数字和下划线(_)组成,其中不能以数字开头,并且区分大小写. 以下划线开头的标识符是有特殊意义的: 单下划线开头的如 _foo,表示不能直接访问的类属性,需要通过类 ...

  4. python eval函数_Python基础元素语法总结

    一.程序的格式框架 1.缩进 缩进是指每行语句前的空白区域,用来表示Python程序间的包含和层次关系. 一般语句不需要缩进,顶行书写且不留空白. 当表示分支.循环.函数.类等含义,在if,while ...

  5. 学简单python好学吗_python好学吗语法简单吗举个例子

    pythonPython (发音:[ 'paiθ()n; (US) 'paiθn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的 ...

  6. python 连续不等式_python 连续不等式语法糖实例

    通常在多个不等式的时候,需要分着写,比如 x = 1 if x>0 and x<3: print(True) 但是在Python中居然可以连着一起写, x = 1 if 0 print(T ...

  7. python字典均值_Python常用基础语法(函数)汇总

    重点( 要求 ): 1.理解语法( 函数 )的作用. 2.理解语法( 函数 )运用举例的代码块. 一.修改字符串(针对英文字符串)大小写. (1)title() : 将字符串(英文)开头字母装换为大写 ...

  8. python在冒号处显示语法错误_python冒号错误语法无效

    问题1 看看错误:File "", line 3 def__init__(self,name): ^ SyntaxError: invalid syntax 在def和__init ...

  9. python的语法结构_Python特点、语法结构、编码知识

    Python是一种静态强类型解释型高级语言.静态强类型类型是指数据类型指定后不能随意改动,但可以指定改动:解释型与编译型相对应,后者先将整段断码编译成机器码再执行,前者是边编译边执行,后者速度比前者快 ...

  10. python语法参数_python默认参数语法

    我刚刚用python为一个用pygame编写的游戏编写了一个小的文本类,由于某些原因,我的默认参数不起作用.我试着查看python文档,看看这是否能让我知道我做错了什么,但我没有完全了解文档中的语言. ...

最新文章

  1. R 变量名开头不能为数字
  2. sh里的变量 $0 $1 $$ $#
  3. python struct 官方文档
  4. C# 网站静态页面生成器 for 多线程版
  5. 点击率预估又有新花样?
  6. android 手机内存uri_android 的各种目录详解
  7. 繁忙的都市(信息学奥赛一本通-T1392)
  8. 6.1bash编程入门值变量类型、for循环和算术运算
  9. 程序员之路(一年有感)
  10. Ubuntu中配置虚拟专用网络***
  11. Protues 8.8 SP1 无需破解 可用直装版 指路
  12. WEB项目优化:雅虎优化网站的34条法则(转)
  13. 【062】百度识图-以图搜图,查找图源及相似图
  14. vc word bookmark
  15. SAP 物料号系统内部编码导入BAPI报错(E M_ 17)
  16. [C语言编程练习][17]假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?
  17. 论文盲审环节,怎么审?
  18. UCML-领先的B/S应用快速开发工具,基于组件重用和应用框架重用,支持.NET体系,直接生成C#源码;
  19. 北京工作居住证续签收紧_收紧网站的安全带:HTTP安全标题
  20. 2014 北京、西安邀请赛

热门文章

  1. batch script learn
  2. 论文笔记:Multilingual Multimodal Pre-training for Zero-Shot Cross-Lingual Transfer of Vision-Language Mo
  3. 《程序员代码面试指南》第一章:栈与队列
  4. tcs标准编写软件_tcs2010(中国标准编写模板)免费版
  5. cuda cudnn 下载地址
  6. R语言安装包失败方案及DataExplorer包安装方法实践
  7. 数学建模18年美赛题目中英文
  8. ztree 自定义参数_ztree的自定义编辑
  9. csdn资源下载不了问题解决 360浏览器下载不了csdn资源问题解决
  10. linux上实现getch()函数