一般来说,程序中的一段源代码在执行之前会经历下面三个步骤

1 分词/词法分析

这个过程会将由字符组成的字符串分解成有意义的代码快,这些代码块被称为词法单元。例如 var a = 4;会被分解成 var、a、=、4、;

2 解析/语法分析

这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树,这个树就叫“抽象语法树”(AST)。全称 Abstract Syntax Tree。

3 代码生成

将AST转换成可执行代码的过程称为代码生成。抛开具体细节不讲,简单来说就是有某种方法可以将var a= 4; 的AST转化为一组机器指令,用来创建一个叫做a的变量,并将一个值储存在a中。

可能以上的这些听起来有些云里雾里。因为在平时写代码的时候,不关注这些也能写代码。但是多了解一些,就多一扇看到未知世界的窗口。你肯定使用过前端的很多工具插件,webpack,eslint啥的。你知道这些工具的核心都是通过抽象语法树这个概念来实现对代码的检查,分析,转换的吗?

抽象语法树的定义

In computer science, an abstract syntax tree (AST), or just syntax tree, is a tree representation of the abstract syntactic structure of source code written in a programming language.

翻译一下就是:

在计算机科学中,一个抽象语法树,或者词法树,是一个树,这个树表示或者说抽象出了编程语言的源代码的结构。

下面举一个上边工具中的demo,看看js在执行之前的三步中的前两步都是具体的干了啥。

var a = 42;

var b = 5;

function addA(d) {

return a + d;

}

var c = addA(2) + b;

第一步,词法分析,以上代码词法分析之后长成如下图所示

第二步,语法分析,生产抽象语法树,生成的抽象语法树如下图所示

JavaScript Parser

JavaScript Parser 把js源码转化为抽象语法树的解析器。前边我们也说了。浏览器在执行js之前会把js源码通过解析器转化为抽象语法树,再进一步转化为字节码甚至是机器码。

常用的JavaScript Parser有:

使用Esprima生成并使用抽象语法树。

通过esprima将一个空函数的源码生成一棵AST树

通过estraverse遍历并更新AST树

通过escodegen将AST重新生成源码

抽象语法树的用途

其实从以上的三个工具,也可大致猜测到抽象语法树的一般用途了。大致分为几类吧

IDE插件,如代码语法检查,代码风格检查,代码的格式化,代码高亮,代码错误等等之类的

代码的混淆压缩,如UglifyJS2等

转换代码的工具。如webpack,rollup,各种代码规范之间的转换,ts,jsx等转换为原生js

python 抽象语法树_抽象语法树(Abstract Syntax Tree)相关推荐

  1. java抽象语法树_抽象语法树AST的全面解析(一)

    Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...

  2. 语法树与抽象语法树(parse tree abstract syntax tree)

    1 语法树(parse tree): 是在parsing阶段,derivation的图像化表示,parser tree focus on grammar的actual implemment,包括像wh ...

  3. 大数据可视化陈为智慧树_知到智慧树_大数据可视化_大学课后答案

    知到智慧树_大数据可视化_大学课后答案 更多相关问题 用下列方法不能将NaCl和Na2CO3两种溶液区分开的是()A.向两种溶液中分别滴加醋酸B.向两种溶液中分别滴加稀硫 为了除去KCl中少量的MgS ...

  4. 抽象语法树 Abstract syntax tree

    什么是抽象语法树? 在计算机科学中,抽象语法和抽象语法树其实是源代码的抽象语法结构的树状表现形式 在线编辑器 我们常用的浏览器就是通过将js代码转化为抽象语法树来进行下一步的分析等其他操作.所以将js ...

  5. java抽象语法树_抽象语法树(AST)

    抽象语法树(AST) 最近在做一个类JAVA语言的编译器,整个开发过程,用抽象语法树(Abstract SyntaxTree,AST)作为程序的一种中间表示,所以首先就要学会建立相对应源代码的AST和 ...

  6. 抽象语法树 -Abstract Syntax Tree

    什么是抽象语法树? 是源代码结构的一种抽象表示,以树状的形式表现编程语言的语法结构.树上的每个节点都表示源代码中的一种结构. 拆分成语法树 拆解一个简单的add函数 function add(a, b ...

  7. 根据文法画出语法树_输入语法推断的强化学习

    引用:Wu Z, Johnson E, Yang W, et al. REINAM: reinforcement learning for input-grammar inference[C]. fo ...

  8. python画平面直角坐标系_一棵树-可视化之图形化基础之向量

    作者:肖剑华 可视化是前端可视化 图形是计算机图形学 向量就是那个向量,高中学过的,你懂的 树是那棵贼丑的树 结果 首先先看看本文最终的结果. 是不是贼丑!是不是能在画展上卖个好价格! 过程 好了,话 ...

  9. mysql数据库设计与应用答案智慧树_知到智慧树_MySQL数据库设计与应用_答案完整...

    知到智慧树_MySQL数据库设计与应用_答案完整 更多相关问题 [B11]A.carry onB.linger onC.set inD.log in 数据库的三级模式结构中,模式也称为A.逻辑模式B. ...

最新文章

  1. 一说“并发”就想到“多线程”,那就局限了
  2. 如何利用CIC滤波器、CIC补偿滤波器和半带滤波器设计一个高频数字抽取滤波器
  3. Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法
  4. 13行代码AC_习题3-9 子序列 (UVa10340,All in All)
  5. jQuery选择器的效率问题
  6. 错误C4996:'std :: _Copy_impl'
  7. python import 类 继承_python学习之类的继承
  8. rtmp rtsp 区别_鱼胶粉和吉利丁粉的区别
  9. Hadoop Partitioner 实战详解
  10. LINUX查看一个进程用的内存准确数量
  11. python解释器安装步骤_怎么安装python解释器
  12. 戴戒指的含义(以后要结婚的必看)
  13. 2017青岛网络赛 C - The Dominator of Strings(AC自动机)
  14. aardio匹配问题以及编码问题
  15. 2022茶艺师(中级)考试模拟100题及模拟考试
  16. 如何在移动钱包中搭建一个小程序应用商店
  17. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)
  18. 两款网页在线刷网站访客pv和ip的源码
  19. 按键精灵---插件关于窗口的各种操作
  20. DLNA介绍(包括UPnP)

热门文章

  1. jenkin发布代码步骤
  2. c++实现Qt信号槽机制
  3. 私有化构造方法如何实例化对象
  4. 2008服务器 自动删除文件,windows-server-2008 – 尝试删除存储在Windows服务器上的目录,在Mac上,包含在Mac上创建的文件,获取“目录不为空”...
  5. date-fns轻量级日期处理插件
  6. Linux-Centos 主机不能通过域名访问自己
  7. Unity实现2D模式下的摄像机视角控制
  8. xv6---Lab1: Xv6 and Unix utilities
  9. MobaXterm家庭版升级专业版
  10. 2019年1月8日LTC行情分析策略及操作建议(第二期附图)