3.ast脚本深入处理多层相同语句-cnblog

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) => {
});

运行前语句

image-20240703170227891

运算结果

image-20240703170308825

ast强化

强化主要体现在enter和exit的区别

image-20240703170425063

默认是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) => {
});

运行前代码

image-20240703170516049

运行结果

image-20240703170543962

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值