AST抽象语法树

138 阅读1分钟

什么是抽象语法树

抽象语法树是对源代码的一种抽象表示,将源代码树形化。方便我们对源代码进行检查、转换。

源代码转换的流程(babel原理)

  • 将源代码通过词法分析,将源代码转换为具有最小语义的token,比如说let a = 1; 转换为[let, a, =, 1, ;]
  • 将这些token按照一定的规则进行语法分析,生成AST(抽象语法树),一个节点会包含它的类型(变量、函数、代码块),属性信息、子节点。这样的多个节点共同组成一个代码树。
  • 对抽象语法树优化、重构,生成新的AST(抽象语法树)
  • 将新的AST(抽象语法树)按照语言的规则转换为源代码。

至此业已完成

场景: webpack的编译,babel的代码转换,代码压缩、eslint代码检查、prettier的代码格式化都用到AST抽象语法树。

源代码生成AST

const esprima = require('esprima')
const sourceCode = 'const a = 2; let ggboy = 200'
const ast = esprima.parseScript(sourceCode)
console.log(ast)

修改AST并生成新的AST

estraverse.traverse(ast, {
  enter: function (node) {
    node.kind = 'var'
  },
})

AST转换成源代码

const escodegen = require('escodegen')
const transformCode = escodegen.generate(ast)
console.log(transformCode)