浅析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的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
深入解析Python中的list列表及其切片和迭代操作
Mar 13 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
Python探索之ModelForm代码详解
Oct 26 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
python批量识别图片指定区域文字内容
Apr 30 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
Django显示可视化图表的实践
May 10 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
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
php加密解密字符串示例
2016/10/13 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
js循环改变div颜色具体方法
2013/06/25 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
Python可变参数函数用法实例
2015/07/07 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
顶岗实习计划书
2014/01/10 职场文书
公路绿化方案
2014/05/12 职场文书
出生证明格式
2015/06/15 职场文书
婚礼父母致辞
2015/07/28 职场文书
高中班主任寄语
2019/06/21 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python