什么是 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'.

目录
相关文章
|
6月前
|
JavaScript 前端开发 安全
抽象语法树(AST):理解JavaScript代码的抽象语法树
抽象语法树(AST):理解JavaScript代码的抽象语法树
|
9天前
|
安全 数据可视化 编译器
AST 的应用
【10月更文挑战第23天】抽象语法树在软件开发的各个领域都有着广泛而重要的应用。它为代码的分析、优化、生成、转换等提供了基础和支持,是提升代码质量和开发效率的重要工具。随着技术的不断发展,AST 的应用还将不断扩展和深化,为软件开发带来更多的创新和便利。
|
7天前
|
自然语言处理 算法 JavaScript
怎么转化成 AST
【10月更文挑战第25天】将代码转化为 AST 是编译器和代码分析工具中的重要环节,通过对 AST 的操作,可以实现对代码的深入理解和各种自动化处理。不同的编程语言和工具都有各自的 AST 表示和相关的处理方法,但基本的原理和步骤是相似的。
|
7天前
|
JavaScript 前端开发
利用 AST 进行代码优化
【10月更文挑战第25天】利用AST进行代码优化需要对编程语言的语法和语义有深入的理解,以及对AST的结构和遍历操作有熟练的掌握。通过合理地运用各种优化技术,可以显著提高代码的质量和性能。在实际应用中,通常会结合多种优化方法,并根据具体的项目需求和代码特点进行综合优化。
|
7天前
|
JavaScript 前端开发 Java
|
3月前
|
JSON JavaScript 前端开发
JS逆向 AST 抽象语法树解析与实践
JS逆向 AST 抽象语法树解析与实践
53 2
|
JavaScript 数据安全/隐私保护 Python
AST是个啥?
AST是个啥?
162 0
|
自然语言处理 Shell Python
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
113 0
[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
|
存储 JavaScript 开发者
vue2-编译之生成AST
前言 在上篇文章我们分析了编译中parse的部分代码,也就是parseHTML的实现。在parseHTML中通过逐字匹配将template进行了初步解析。现在我们继续分析在parseHTML中输出的结果是如何被parse进行使用的。以此结束完整parse流程的分析。
|
JSON JavaScript 安全
分分钟学会 JS AST,打造自己的编译器
抽象语法树是js代码另一种结构映射,可以将js拆解成AST,也可以把AST转成源代码。这中间的过程就是我们的用武之地。 利用 抽象语法树(AST) 可以对你的源代码进行修改、优化,甚至可以打造自己的编译工具。其实有点类似babel的功能。咱们就一起学习下怎么玩转 ast。
671 0
分分钟学会 JS AST,打造自己的编译器