浅析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操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
python实现k-means聚类算法
Feb 23 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
python如何将多个PDF进行合并
Aug 13 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
python自动化八大定位元素讲解
Jul 09 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
nodejs文件夹深层复制功能
2019/09/03 NodeJs
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
vue v-model的用法解析
2020/10/19 Javascript
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
Python跳出多重循环的方法示例
2019/07/03 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Pyqt5自适应布局实例
2019/12/13 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
python实现图像拼接功能
2020/03/23 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
读群众路线心得体会
2014/03/07 职场文书
节约电力资源的建议书
2014/03/12 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
人口与计划生育责任书
2015/05/09 职场文书
小学庆六一主持词
2015/06/30 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python