浅析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中的全局变量用法分析
Jun 09 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
Python爬豆瓣电影实例
Feb 23 Python
python使用sqlite3时游标使用方法
Mar 13 Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 Python
python+pyqt5实现24点小游戏
Jan 24 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
python设置环境变量的原因和方法
Jun 24 Python
Python csv文件的读写操作实例详解
Nov 19 Python
python中resample函数实现重采样和降采样代码
Feb 25 Python
Python数据分析之绘图和可视化详解
Jun 02 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
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
php PDO异常处理详解
2016/11/20 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
简述vue中的config配置
2018/01/23 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
Python实现注册登录系统
2017/08/08 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
新员工入职感言
2014/02/01 职场文书
学生评语大全
2014/04/18 职场文书
初三学习计划书范文
2014/04/30 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
银行进社区活动总结
2014/07/07 职场文书
团队会宣传标语
2014/10/09 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
小学语文教师研修日志
2015/11/13 职场文书