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混淆概念参考