ast处理数学运算代码
加wx:a15839601257 拉vx群
// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
const types = require("@babel/types")
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;
// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
encoding: "utf-8"
});
// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
sourceType: "module", // 对import进行控制,防止报错
});
// console.log(JSON.stringify(ast,null,"\t")) //将原来的格式输出为ast树
// 对AST进行一系列操作
let visitor = {
"BinaryExpression"(path) {
let {left, operator, right} = path.node;
if (types.isNumericLiteral(left) && operator == "+" && types.isNumericLiteral(right)) {
let value = left.value + right.value;//提取出左节点右节点相加
console.log(value);
let result = types.NumericLiteral(value);
path.replaceWith(result);//节点替换节点生成新的值
}
}
}
traverse(ast,visitor)
// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, {
retainLines: false, // 是否与源代码的行号相同,默认是否
comments: false, // 是否保留源代码的注释,默认是true
compact: true // 是否压缩代码
}).code;
//将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {
});
运行前语句
运算结果
ast强化
强化主要体现在enter和exit的区别
默认是enter,只进入一层,exit会陷入循环
// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
const types = require("@babel/types")
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;
// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
encoding: "utf-8"
});
// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
sourceType: "module", // 对import进行控制,防止报错
});
// console.log(JSON.stringify(ast,null,"\t")) //将原来的格式输出为ast树
// 对AST进行一系列操作
let visitor = {
"BinaryExpression": {
exit(path) {
let {left, operator, right} = path.node;
if (types.isNumericLiteral(left) && operator == "+" && types.isNumericLiteral(right)) {
let value = left.value + right.value;//提取出左节点右节点相加
console.log(value);
let result = types.NumericLiteral(value);
path.replaceWith(result);//节点替换节点生成新的值
}
}
}
}
traverse(ast, visitor)
// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, {
retainLines: false, // 是否与源代码的行号相同,默认是否
comments: false, // 是否保留源代码的注释,默认是true
compact: false // 是否压缩代码
}).code;
//将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {
});