浅析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用字典统计单词或汉字词个数示例
Apr 22 Python
python实现通过shelve修改对象实例
Sep 26 Python
python列表操作实例
Jan 14 Python
python实现TF-IDF算法解析
Jan 02 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
python3使用SMTP发送简单文本邮件
Jun 19 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
Python之变量类型和if判断方式
May 05 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 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三层结构(上) 简单三层结构
2010/07/04 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
JS中类或对象的定义说明
2014/03/10 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
实例讲解JavaScript预编译流程
2019/01/24 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
python encode和decode的妙用
2009/09/02 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
英国著名书店:Foyles
2018/12/01 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
办公室主任先进事迹
2014/01/18 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
学生党员检讨书范文
2014/12/27 职场文书
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python