浅析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的PEAK来适配协议的教程
Apr 14 Python
Python enumerate索引迭代代码解析
Jan 19 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
eclipse创建python项目步骤详解
May 10 Python
python 默认参数相关知识详解
Sep 18 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
pygame实现飞机大战
Mar 11 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
Python之字符串的遍历的4种方式
Dec 08 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 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 团购折扣计算公式
2011/11/24 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
简单的Python调度器Schedule详解
2019/08/30 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
大学毕业生的自我鉴定
2013/11/30 职场文书
关于运动会的稿件
2014/02/02 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技