浅析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使用socket远程连接错误处理方法
Apr 29 Python
python3实现暴力穷举博客园密码
Jun 19 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
python spyder中读取txt为图片的方法
Apr 27 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
Python对切片命名的实现方法
Oct 16 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python threading.local代码实例及原理解析
Mar 16 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
基于python 凸包问题的解决
Apr 16 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
Python 微信公众号文章爬取的示例代码
Nov 30 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 数据结构 算法 三元组 Triplet
2011/07/02 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python 字符串换行的多种方式
2018/09/06 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
python+django+rest框架配置创建方法
2019/08/31 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
Python文件路径名的操作方法
2019/10/30 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
高三自我鉴定范文
2013/10/19 职场文书
化学教学随笔感言
2014/02/19 职场文书
高中家长寄语
2014/04/02 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
安全教育培训心得体会
2016/01/15 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
SSM VUE Axios详解
2021/10/05 Vue.js