浅析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命令行参数sys.argv使用示例
Jan 28 Python
python在linux中输出带颜色的文字的方法
Jun 19 Python
详解Python中的动态属性和特性
Apr 07 Python
对python append 与浅拷贝的实例讲解
May 04 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
Python实现敏感词过滤的4种方法
Sep 12 Python
Python爬虫之Selenium鼠标事件的实现
Dec 04 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
pycharm代码删除恢复的方法
Jun 26 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分页函数
2006/10/09 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
Python 支付整合开发包的实现
2019/01/23 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
旅游项目开发策划书
2014/01/18 职场文书
家长评语大全
2014/01/22 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
活着观后感
2015/06/03 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python