浅析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装饰器初探(推荐)
Jul 21 Python
Python 闭包的使用方法
Sep 07 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
从django的中间件直接返回请求的方法
May 30 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
python加载自定义词典实例
Dec 06 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
Python类的继承super相关原理解析
Oct 22 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
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使用ob_start生成html页面的方法
2014/11/07 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
php pdo操作数据库示例
2017/03/10 PHP
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
JavaScript表单验证开发
2016/11/23 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
JS实现滑动插件
2020/01/15 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
js实现带有动画的返回顶部
2020/08/09 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
python共享引用(多个变量引用)示例代码
2013/12/04 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
html5录音功能实战示例
2019/03/25 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
高三体育教学反思
2014/01/29 职场文书
青年志愿者活动方案
2014/08/17 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
社区服务活动感想
2015/08/11 职场文书
采购部年度工作总结
2015/08/13 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python