浅析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 del()函数用法
Mar 24 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
python绘制简单折线图代码示例
Dec 19 Python
python实现windows下文件备份脚本
May 27 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
Python 数据可视化pyecharts的使用详解
Jun 26 Python
Python动态语言与鸭子类型详解
Jul 01 Python
基于python中__add__函数的用法
Nov 25 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 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
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
python内存管理分析
2015/04/08 Python
Python检测QQ在线状态的方法
2015/05/09 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
Python paramiko模块的使用示例
2018/04/11 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
numpy基础教程之np.linalg
2019/02/12 Python
python如何把字符串类型list转换成list
2020/02/18 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
keras输出预测值和真实值方式
2020/06/27 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
木工主管岗位职责
2013/12/08 职场文书
银行演讲稿范文
2014/01/03 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
python实现简单聊天功能
2021/07/07 Python
Github 使用python对copilot做些简单使用测试
2022/04/14 Python