浅析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比较2个xml内容的方法
May 11 Python
python简单实现基数排序算法
May 16 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
Python中一些不为人知的基础技巧总结
May 19 Python
Python闭包执行时值的传递方式实例分析
Jun 04 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
Flask之请求钩子的实现
Dec 23 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
弄清Pytorch显存的分配机制
Dec 10 Python
Python初识逻辑与if语句及用法大全
Aug 07 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
在Python的web框架中配置app的教程
2015/04/30 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
党员公开承诺践诺书
2014/03/25 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
2014年幼师工作总结
2014/11/22 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技