const {parse} = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generator = require("@babel/generator").default;// 1.定义要处理的代码
const jscode = `function square(n) {return n * n;
}`;// 2.使用@babel/parser模块解析代码
const ast = parse(jscode);// 3.使用@babel/traverse模块遍历代码,如果遇到名为"n"的标识符,则将其名称更改为"x"
traverse(ast, {enter(path) {if (path.isIdentifier({ name: "n" })) {path.node.name = "x";}},
});// 4.使用@babel/generator模块生成代码
let { code } = generator(ast);// 打印生成的代码
console.log(code);
ast应用在语法高亮,格式化的思路:
- 读取语言文件
- 使用语言解析器解析成语法树
- 对语法树遍历处理(加高亮,格式化)
- 对语法树进行还原
- 将源码写回语言文件
也可以应用在语言混淆以及加密上。
ast混淆概念参考