浅析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 相关文章推荐
使用python编写批量卸载手机中安装的android应用脚本
Jul 21 Python
详解Python中的日志模块logging
Jun 19 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
python使用webdriver爬取微信公众号
Aug 31 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
Django框架 Pagination分页实现代码实例
Sep 04 Python
python中resample函数实现重采样和降采样代码
Feb 25 Python
Python3自定义json逐层解析器代码
May 11 Python
python导入库的具体方法
Jun 18 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
详解Python流程控制语句
Oct 28 Python
python unittest单元测试的步骤分析
Aug 02 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
PHP crypt()函数的用法讲解
2019/02/15 PHP
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
基于insertBefore制作简单的循环插空效果
2015/09/21 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
python执行子进程实现进程间通信的方法
2015/06/02 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
应届生学校辅导员求职信
2013/11/07 职场文书
企业承诺书怎么写
2014/05/24 职场文书
体育节口号
2014/06/19 职场文书
市场营销计划书
2015/01/17 职场文书
事业单位聘任报告
2015/03/02 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
导游词之长城八达岭
2019/09/24 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL