浅析AST抽象语法树及Python代码实现


Posted in Python onJune 06, 2016

在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。
和抽象语法树相对的是具体语法树(concrete syntaxtree),通常称作分析树(parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。
抽象语法树的结构不依赖于源语言的文法,也就是语法分析阶段所采用的上下文无关文法。因为在Parser工程中,经常会对文法进行等价的转换(消除左递归、回溯、二义性等),这样会给文法引入一些多余的成分,对后续阶段造成不利影响,甚至会使各阶段变得混乱。因此,很多编译器(包括GJC)经常要独立地构造语法分析树,为前、后端建立一个清晰的接口。

Python实现
假设对'a + 3 * b'进行解释,其中a=2,b=5
代码很简单,就不再进行详细的解释了。

Num = lambda env, n: n 
Var = lambda env, x: env[x] 
Add = lambda env, a, b:_eval(env, a) + _eval(env, b) 
Mul = lambda env, a, b:_eval(env, a) * _eval(env, b) 
 
_eval = lambda env, expr:expr[0](env, *expr[1:]) 
 
env = {'a':2, 'b':5} 
tree = (Add, (Var, 'a'), 
       (Mul, (Num, 3), 
          (Var, 'b'))) 
 
print _eval(env, tree)

输出结果为17

Python 相关文章推荐
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
django框架使用方法详解
Jul 18 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
python实现证件照换底功能
Aug 20 Python
初学者学习Python好还是Java好
May 26 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
如何在Win10系统使用Python3连接Hive
Oct 15 Python
教你用python控制安卓手机
May 13 Python
Python matplotlib绘制雷达图
Apr 13 Python
Python之Matplotlib绘制热力图和面积图
Apr 13 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 #Python
在Python的Flask框架中构建Web表单的教程
Jun 04 #Python
Python中规范定义命名空间的一些建议
Jun 04 #Python
全面理解Python中self的用法
Jun 04 #Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 #Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 #Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 #Python
You might like
PHP session会话的安全性分析
2011/09/08 PHP
深入理解PHP内核(一)
2015/11/10 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
Ajax基础知识详解
2017/02/17 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
python写日志封装类实例
2015/06/28 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
详解python算法之冒泡排序
2019/03/05 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
线程同步的方法
2016/11/23 面试题
法律专业应届生自荐信范文
2014/01/06 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
邀请函的格式
2015/01/30 职场文书
催款通知书范文
2015/04/17 职场文书
Django migrate报错的解决方案
2021/05/20 Python
Go gorilla/sessions库安装使用
2022/08/14 Golang