什么是 AST?

简介: 什么是 AST?

我们先来通过工具【AST Explorer】看一段代码:

const add = (a, b) => a + b;



20210407090637667.png




代码对应的 json 数据:

{
  "type": "Program",
  "start": 0,
  "end": 28,
  "body": [
    {
      "type": "VariableDeclaration", // 变量声明
      "start": 0,
      "end": 28,
      "declarations": [ // 具体声明
        {
          "type": "VariableDeclarator",
          "start": 6,
          "end": 27,
          "id": {
            "type": "Identifier", // 标识符
            "start": 6,
            "end": 9,
            "name": "add" // 函数名
          },
          "init": {
            "type": "ArrowFunctionExpression", // 箭头函数
            "start": 12,
            "end": 27,
            "id": null,
            "expression": true,
            "generator": false,
            "async": false,
            "params": [ // 参数
              {
                "type": "Identifier",
                "start": 13,
                "end": 14,
                "name": "a"
              },
              {
                "type": "Identifier",
                "start": 16,
                "end": 17,
                "name": "b"
              }
            ],
            "body": { // 函数体
              "type": "BinaryExpression", // 二项式
              "start": 22,
              "end": 27,
              "left": { // 二项式左边
                "type": "Identifier",
                "start": 22,
                "end": 23,
                "name": "a"
              },
              "operator": "+", // 二项式运算符
              "right": { // 二项式右边
                "type": "Identifier",
                "start": 26,
                "end": 27,
                "name": "b"
              }
            }
          }
        }
      ],
      "kind": "const"
    }
  ],
  "sourceType": "module"
}


也可以自己画一棵树https://resources.jointjs.com/demos/javascript-ast


20210410111714780.png


就会生成一个树


2021041011161759.png



概念


在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。(来自百科)


规范参考:【The ESTree Spec】


强力推荐阅读【the-super-tiny-compiler】




常见用途


代码语法、风格、的检查

代码的格式化、高亮、错误提示、自动补全

代码混淆压缩

UglifyJS2 (命令行工具,用于压缩 JavaScript 代码)

优化变更代码,改变代码结构使达到想要的结构

代码打包工具 webpack、rollup 等等

CommonJS、AMD、CMD、UMD等代码规范之间的转化

CoffeeScript、TypeScript、JSX 等转化为原生 Javascript




图示过程


20210407102020282.png


1、esprima :把源码转化为 AST。https://esprima.org/


pdf文档

   Esprima is a high performance, standard-compliant ECMAScript parser written in ECMAScript (also popularly known as JavaScript).


   Esprima can be used to perform lexical analysis (tokenization) or syntactic analysis (parsing) of a JavaScript program.


翻译:


   Esprima是用ECMAScript(也称为JavaScript)编写的高性能,符合标准的ECMAScript解析器。

   Esprima可用于执行JavaScript程序的词法分析(标记化)或语法分析(解析)。


A simple example on Node.js REPL:


var esprima = require('esprima');
var program = 'const answer = 42';
esprima.tokenize(program);
[ { type: 'Keyword', value: 'const' },
  { type: 'Identifier', value: 'answer' },
  { type: 'Punctuator', value: '=' },
  { type: 'Numeric', value: '42' } ]
esprima.parse(program);
{ type: 'Program',
  body:
   [ { type: 'VariableDeclaration',
       declarations: [Object],
       kind: 'const' } ],
  sourceType: 'script' }



2、estraverse:遍历并更新 AST。https://github.com/estools/estraverse

   Estraverse (estraverse) is ECMAScript traversal functions from esmangle project.


翻译:

   Estraverse(estraverse)是esmangle项目中的ECMAScript遍历函数。


Example Usage:

   The following code will output all variables declared at the root of a file.


estraverse.traverse(ast, {
    enter: function (node, parent) {
        if (node.type == 'FunctionExpression' || node.type == 'FunctionDeclaration')
            return estraverse.VisitorOption.Skip;
    },
    leave: function (node, parent) {
        if (node.type == 'VariableDeclarator')
          console.log(node.id.name);
    }
});


Usage:https://github.com/estools/estraverse/wiki/Usage

20210407110644626.png


3、escodegen:将 AST 重新生成源码。https://github.com/estools/escodegen

   Escodegen (escodegen) is an ECMAScript (also popularly known as JavaScript) code generator from Mozilla’s Parser API AST.


翻译:

   Escodegen(escodegen)是Mozilla的Parser API AST的ECMAScript(也称为JavaScript)代码生成器。



npm install escodegen


Usage:

A simple example: the program:

escodegen.generate({
    type: 'BinaryExpression',
    operator: '+',
    left: { type: 'Literal', value: 40 },
    right: { type: 'Literal', value: 2 }
});


produces the string '40 + 2'.

目录
相关文章
|
30天前
|
JavaScript 前端开发 安全
抽象语法树(AST):理解JavaScript代码的抽象语法树
抽象语法树(AST):理解JavaScript代码的抽象语法树
|
1月前
|
JavaScript 算法 前端开发
基于抽象语法树+diff算法实现Markdown编译器
基于抽象语法树+diff算法实现Markdown编译器
|
9月前
|
JavaScript 数据安全/隐私保护 Python
AST是个啥?
AST是个啥?
116 0
|
存储 JavaScript 开发者
vue2-编译之生成AST
前言 在上篇文章我们分析了编译中parse的部分代码,也就是parseHTML的实现。在parseHTML中通过逐字匹配将template进行了初步解析。现在我们继续分析在parseHTML中输出的结果是如何被parse进行使用的。以此结束完整parse流程的分析。
|
Java 编译器 程序员
字节码插桩(四) | AST
我们通过 AndroidStudio 生成Bean对象一般是通过注解来实现自动生成getter/setter方法、equals()和hashCode()方法,其中类(或接口)要符合驼式命名法,首字母大写。方法要符合驼式命名法,首字母小写,类或实例变量要符合驼式命名法,首字母小写。常量要求全部由大写字母或下划线构成,且第一个字符不能是下划线,否则编译器会报警告
131 0
字节码插桩(四) | AST
|
自然语言处理 Shell Python
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
92 0
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
|
编解码 前端开发 JavaScript
es6 语法解析
虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了。所以就算你现在不打算使用ES6,但为了看懂别人的你也该懂点ES6的语法了...
61 0
|
JSON 自然语言处理 JavaScript
怎么理解AST,并实现手写babel插件
怎么理解AST,并实现手写babel插件
163 0
|
JSON JavaScript 安全
分分钟学会 JS AST,打造自己的编译器
抽象语法树是js代码另一种结构映射,可以将js拆解成AST,也可以把AST转成源代码。这中间的过程就是我们的用武之地。 利用 抽象语法树(AST) 可以对你的源代码进行修改、优化,甚至可以打造自己的编译工具。其实有点类似babel的功能。咱们就一起学习下怎么玩转 ast。
601 0
分分钟学会 JS AST,打造自己的编译器

热门文章

最新文章