什么是抽象语法树
抽象语法树是对源代码的一种抽象表示,将源代码树形化。方便我们对源代码进行检查、转换。
源代码转换的流程(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)