美文网首页
抽象语法树 ast

抽象语法树 ast

作者: 我叫Aliya但是被占用了 | 来源:发表于2019-10-04 09:30 被阅读0次
  1. 源代码转换成树 插件用 esprima

    https://astexplorer.net/ 在线生成代码树

  2. 深度优先遍历 estraverse

  3. 改变数

  4. 生成树 escodegen

let esprima = require("esprima");
let estraverse = require("estraverse");
let escodegen = require( "escodegen");

let code = 'function a () {}'

let ast = esprima.parseScript(code) // 解析脚本,生成树
estraverse.traverse(ast, {      // 遍历树
    enter (node) { 
        console.log('enter: ',node.type)
        if (node.type == "Identifier") node.name = 'hahaha' // 修改树
    },
    leave (node) { 
        console.log('leave: ',node.type)
    }
})

let r = escodegen.generate(ast) // 生成新脚本
console.log(typeof r, r)

用于代码混淆压缩、语法检查、格式检查、错误提示、自动补全等

利用babel,es6 剪头函数 转es5

// es6 剪头函数 转es5
let babel = require('@babel/core')
let code = 'let fn = (a,b) => a+b'

let r = babel.transform(code, {
    plugins: [
        '@babel/plugin-transform-arrow-functions'
    ]
    // presets: [
    //     '@babel/preset-env'
    // ]
})
console.log(r.code)

借助 https://astexplorer.net/ 自己实现es6剪头函数转es5

// es6 剪头函数 转es5
let babel = require('@babel/core')
let t = require('@babel/types')
let code = 'let fn = (a,b) => a+b'
let arrowFunctions = {
    visitor: {      // 访问者模式
        ArrowFunctionExpression(path) {
            let node = path.node
            let body = node.body
            if (t.isBinaryExpression(body)) { // 是二进制流,不是函数体
                body = t.blockStatement([t.returnStatement(body)])
            }
            // 生成一个新 es5方法 结点
            let newnode = t.functionExpression(null, node.params, body)
            path.replaceWith(newnode)
        }
    }
}

let r = babel.transform(code, {
    plugins: [
        arrowFunctions
        // '@babel/plugin-transform-arrow-functions'
    ]
    // presets: [
    //     '@babel/preset-env'
    // ]
})
console.log(r.code)

相关文章

  • 抽象语法树AST的全面分析(三)

    AST操作 抽象语法树AST的全面分析(一)抽象语法树AST的全面分析(二)前面两篇文章写到了抽象语法树的生成过程...

  • JS编译——AST

    JS编译——AST AST 抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Synt...

  • AST反混淆实战(一)

    AST简介 抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree)...

  • 零散专题35 AST抽象语法树.md

    什么是抽象语法树 抽象语法树(abstract syntax tree,AST,或者简称语法树)是源代码的抽象语法...

  • 逆向进阶,利用 AST 技术还原 JavaScript 混淆代码

    什么是 AST AST(Abstract Syntax Tree),中文抽象语法树,简称语法树(Syntax Tr...

  • JavaScript中的 抽象语法树 AST

    AST 抽象语法树(Abstract Syntax Tree)也称为AST语法树,指的是源代码语法所对应的树状结构...

  • vue3原理

    AST AST:抽象语法树,Abstract Syntax Tree。TypeScript、babel、webpa...

  • JS抽象语法树(AST)

    什么是抽象语法树 抽象语法树(Abstract Syntax Tree)也称为AST语法树,是源代码语法所对应的树...

  • AST

    抽象语法树 抽象语法树(Abstract Syntax Tree)简称 AST ,是源代码的抽象语法结构的树状表现...

  • 一文助你搞懂AST

    什么是 AST 抽象语法树(Abstract Syntax Tree)简称 AST,是源代码的抽象语法结构的树状表...

网友评论

      本文标题:抽象语法树 ast

      本文链接:https://www.haomeiwen.com/subject/rkwjpctx.html