最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • AST-知识学习及拓展

    正文概述 掘金(bugaboo)   2020-12-05   564

    前置知识

    对于编译型语言(java),编译分为:词法分析->语法分析->语义检查->代码优化和字节码生产。 对于解释型语言(javascript),词法分析->语法分析->语法树->开始解释执行。

    从上面的执行过程,可以知道两个点,javascript 不会生成字节码,而是语法树。这就是 AST (抽象语法树:Abstract Syntax Tree),相当于编译型语言的编译器。

    了解 Javascript AST 运转过程

    用个简单的例子

    var AST = 'I am good boy';
    
    1. 词法分析

    这个过程也叫扫描(scanner),将有利于开发者查看的字符流(char stream)转成便于处理的数据标记,记号流(token stream) 这个过程会移除注释和空白付符,因为这些,对于代码运行无意义,只是为了提高可维护性及美观。

    [
      { type: 'Keyword', value: 'var' },
      { type: 'Identifier', value: 'AST' },
      { type: 'Punctuator', value: '=' },
      { type: 'String', value: "'I am good boy'" }
    ]
    
    1. 语法分析

    你可以理解成解析器,不同的标记,对应着不同的语法。语法分析,主要是将这些标记转换成对应语法的数据结构。 同时也会对代码进行语法校验,有错误的会抛出。 通过语法分析转换后的ast,并不是百分百对于源码的,这语法分析过程中,会剔除一些不合法的东西,比如不完整的括号。 如果你想获取百分百对应源码的树结构,可以去了解一下CST(具体语法树),这里就不扩展讲了。 Ast 查看工具

    既然AST叫抽象语法树,那么它就是有树的结构,也就有节点。 tip:

    • type 指明节点的类型
    • start 记录开始的标记位
    • end 记录结束的标记位
    // 根
    Program {                         // 根节点,表示整个代码块
      type: Program
      start: 0
      end: 25
      body: [                         // 主体
        VariableDeclaration {           // 变量声明节点
          type: VariableDeclaration
          start: 0
          end:25
          declarations: [               // 包含来变量初始值,是变量声明的主要内容
            VariableDeclaration {           // 变量声明节点
              type: VariableDeclaration
              start: 4
              end:24
              id: Identifier {              // 标识符
                type: "Identifier"
                start: 4
                end: 7
                name: "AST"                 // 值
              }
              init: Literal {               // 字面量,计算机公认的一种固定基础类型值的表示法
                type: "Literal"
                start: 10
                end: 24
                value: "I'm good boy"       // 值
                raw: "\"I'm good boy\""     // 未处理值
              }
            }
          ]
          kind: "var"                   // 变量声明的关键字(我们甚至可以通过遍历语法树,将所有var改为let)
        }
      ]
      sourceType: "module"          // 表示代码类型
    }
    

    总结

    1. AST 把我们的代码用数据结构来表示,抽象化,特别符合它名字,抽象语法树。(利用树的结构,表示抽象代码语法的通用结构,有利于二次转换)
    2. 抽象后的代码,更利于我们去做些事情。比如,代码风格检查、语法高亮、错误提示、格式化代码、主动补全、代码混淆压缩、改变代码结构(某些跨端框架原理)、兼容等

    认识一些工具

    • esprima: ECMAScript parsing infrastructure for multipurpose analysis
    • estraverse: ECMAScript JS AST traversal functions
    • escodegen: ECMAScript code generator
    • recast: JavaScript syntax tree transformer, nondestructive pretty-printer, and automatic source map generator

    demo

    练习项目


    起源地下载网 » AST-知识学习及拓展

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元