【AST抽象语法树】结构分析及特性

news2024/10/11 6:34:29

在这里插入图片描述

什么是AST?

AST译名抽象语法树(Abstract Syntax Tree),是一种用于表示源代码结构的数据结构。

它在编译器、解析器和静态代码分析等领域中被广泛使用。

AST结构分析

在这里插入图片描述

我们利用成熟的astexplorer来进行结构化的比较和分析。可以尝试登录以下网址访问:

https://astexplorer.net/ 点击直接访问

在这里插入图片描述
登录网址后,我们尝试写一段示例代码并观察其AST结构。

基本结构分析及转换

示例vue源码

以简单的vue demo代码为例:template包含两个p标签作为示例源码,且不包含css相关代码。

<template>
  <p>{{ code }} AST!</p>
  <p>AST 2 TEST!</p>
</template>

<script>
export default {
  data () {
    return {
      code: "Go"
    };
  }
};
</script>

得到的JSON表达的树结构如所示
在这里插入图片描述
简概Json体结构

{
  "type": 0,
  "children": [
  //指示template标签
    {
      "type": 1,
      "ns": 0,
      "tag": "template",
      "tagType": 0,
      "props": [],
      "isSelfClosing": false,
      "children": [],
      "loc": {}
    },
    //指示script标签
    {
      "type": 1,
      "ns": 0,
      "tag": "script",
      "tagType": 0,
      "props": [],
      "isSelfClosing": false,
      "children": [],
      "loc": {}
    }
  ],
  "helpers": [],
  "components": [],
  "directives": [],
  "hoists": [],
  "imports": [],
  "cached": 0,
  "temps": 0,
  "loc": {}

属性解析:

  • type:指代节点的类型,用于标识不同类型的语法单元或操作。例如,可以是"VariableDeclaration"、"FunctionDeclaration"等。
  • ns:指代命名空间(Namespace)属性,用于表示XML或HTML文档中某个元素节点所属的命名空间。对于大多数编程语言而言,默认为空即可。
  • tag:指代标签(Tag)属性,在HTML或XML文档中使用。它表示一个元素节点所对应的标签名称,例如 “div”, “p”, "span"等。
  • tagType:指代标签类型(Tag Type),也只存在于HTML或XML文档中。它描述了特殊的标签行为,并且可能影响解析和渲染过程。常见值包括:“open”,
    “close”, “selfClosing”.
  • props:指代属性集合(Properties),存储与当前节点相关联的所有属性信息。这些信息可以是该节点自身定义的属性、继承自父级别对象、从其他地方引入等等。
  • props:指代属性集合(Properties),存储与当前节点相关联的所有属性信息。这些信息可以是该节点自身定义的属性、继承自父级别对象、从其他地方引入等等。
  • loc:指代位置信息(Location),描述了源代码中该AST节点对应的位置范围,通常包括行号、列号等信息。这些信息在进行错误定位、调试和格式化时非常有用。
  • helpers:指代帮助函数(Helpers),用于存储在转换或编译过程中生成的辅助函数。这些辅助函数通常是为了实现特定功能或处理复杂逻辑而引入的。
  • components:指代组件(Components),用于存储当前模块所依赖或使用到的组件信息。这些信息可以包括组件名称、路径、导入声明等。
  • directives:指代指令(Directives),用于存储与当前模块相关联的所有自定义指令信息。这些信息可以包括指令名称、参数、修饰符等。
  • hoists:指代提升项(Hoists),用于存储需要被提前计算并缓存起来以优化性能的表达式或计算结果。通过将这些表达式移出循环结构,可以减少重复计算次数。
  • imports:指代导入项(Imports),用于描述当前模块所引入的外部模块,并记录其对应关系和可访问性等相关信息。
  • cached:用于缓存一次求值结果,并在后续多次使用时直接返回缓存值,避免重复计算造成性能损耗。
  • temps:临时变量(Temporaries),用于存储在生成的代码中临时使用的变量。这些变量通常是为了辅助实现某个功能或处理过程中所需要的临时数据

AST的特性

在这里插入图片描述

我们尝试总结AST结构的数据有什么特性

  • 1. 嵌套层级的结构(递归特性):AST是一种树状结构,由各个节点组成。每个节点代表源代码中的一个语法单元或操作,而父子关系表示了这些语法单元之间的嵌套关系和层次结构。比如template和script作为同级都被嵌套在"type": 0层级的children中。

为什么会是递归?
编程语言中的代码通常具有多级嵌套的结构,例如条件语句、循环语句、函数定义等。为了正确地捕捉这些结构并反映在AST中,递归就变成了一种非常合适的结构。

  • 2. 抽象性:AST将源代码转换为更抽象的形式。它会忽略掉一些细节、标点符号和不必要的空格等内容,并着重于捕捉代码的逻辑结构和语义信息。
  • 3. 可扩展性:由于AST本身是一个数据结构,在需要进行静态分析、优化或转换时可以方便地对其进行修改和扩展。

这就为我们在Babel中使用@babel/type可以对AST的数据结构进行修改提供了前提。
Babel相关可阅读<Babel>前端语言的巴别塔

总结

随着前端的不断发展,在越来越多的场景下,我们需要对源码进行转换、优化等操作,而AST作为中间的转化产物,提供了通用的方式来代替源码结构,并可以便捷的进行修改,进而生成新的结构输出源码。并且通过遍历和检查AST,我们也可以执行各种如类型检查的静态分析任务。总之,AST已经变成了在百花齐放的前端架构体系下,不可或缺的一门技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler学习笔记

Fiddler简介 学习Fiddler的基础前置知识 请求行又包括请求方法&#xff0c;统一资源定位符、请求协议及版本号 统一资源定位符就是资源的绝对路径 请求体里写服务器需要的参数 304是服务器没有变化&#xff0c;根据请求头发现请求的内容和本地一样&#xff0c;就不再发回来了 …

【雕爷学编程】Arduino动手做(172)---WeMos D1开发板模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

7.python设计模式【桥结模式】

内容&#xff1a;将一个事物的两个维度分离&#xff0c;使其都可以独立变化角色&#xff1a; 抽象&#xff08;Abstraction&#xff09;细化抽象&#xff08;RefinedAbstraction&#xff09;实现者&#xff08;Implementor&#xff09;具体实现者&#xff08;ConcreteImplement…

Ubuntu16.04LTS安装ROS测试小海龟样例

一、参考资料 在Ubuntu中安装ROS Kinetic ROS安装ubuntu16.04 无需科学上网解决sudo rosdep init初始化问题 二、安装ROS关键步骤 1. 选择ROS版本 ROS安装选择 Ubuntu版本不同&#xff0c;对应安装的ROS版本也不同&#xff0c;务必版本对齐&#xff1b;Kinetic版本的ROS对…

iPortal 注册登录模块扩展开发

作者&#xff1a;yx 文章目录 前言一、示例代码简介二、对接 iPortal REST API 接口2.1、登录模块扩展开发2.2、注册模块扩展开发 三、页面内容及样式实现四、配置启用定制页面 前言 针对注册登录模块&#xff0c;iPortal 允许用户通过 iFrame 方式接入自行开发的页面&#xf…

JavaWeb开发(后端Web开发【一】)

文章目录 前言一、Maven1.Maven概述-介绍1.1.Maven概述-介绍1.2.Maven概述-安装 2.IDEA集成Maven2.1.IDEA集成Maven-配置Maven环境2.2.IDEA集成Maven-创建Maven项目2.3.IDEA集成Maven-导入Maven项目 3.Maven-依赖管理3.1.Maven-依赖管理-依赖配置3.2.Maven-依赖管理-依赖传递3.…

Unity小游戏——怪物出现模式的管理

摘要&#xff1a;游戏启动后不久&#xff0c;画面前方将出现怪物&#xff0c;游戏的目标是不停地看到怪物并持续前进 一、怪物出现的时间节点 我们首先来看如何来确定怪物出现的间隔。 若是怪物相继出现的时间间隔很短&#xff0c;玩家就必须快速地点击按键&#xff0c;这样游…

目前新能源汽车充电桩的发展受到哪些不利因素的影响?

目前新能源汽车充电桩的发展受到哪些不利因素的影响? 一是安装难&#xff0c;很多老旧小区没有充电桩配套施工规范&#xff0c;充电桩建设比较难&#xff0c;受到充电容量不足电表箱供电等局限性的制约&#xff0c;同时缺乏充电桩配套设施的统一规划&#xff0c;小区内只能安装…

元学习(小样本)-基本概念

机器学习 概述 以分类任务为例&#xff0c;机器学习可以看作是找一个猫狗的分类函数。 step1: 设计未知函数&#xff1b;其中&#xff0c;权重和偏置都是神经元中位置参数&#xff08;可学习的&#xff09;&#xff1b;step2: 定义损失函数&#xff1b;step3&#xff1a;训练…

SpringBoot----(1)基础

目录 1 SpringBoot简介1.1 入门案例&#xff08;IDEA构建&#xff09;1.2 官网构建工程1.3 SpringBoot程序快速启动1.4 SpringBoot概述1.5 起步依赖1.6 程序启动1.7 切换web服务器 2 配置2.1 配置文件格式&#xff08;3种&#xff09;2.2 yaml格式2.3 yaml数据读取方式&#xf…

Maven-----进阶

目录 1 分模块开发1.1 分模块开发的意义1.2 分模块开发实现 2 依赖管理2.1 依赖传递2.2 依赖传递冲突问题2.3 可选依赖和排除依赖 3 继承与聚合3.1 聚合3.2 继承3.2 聚合与继承的区别 4 属性4.1 属性4.2 资源文件引用属性4.3 版本管理 5 多环境配置与使用5.1 多环境开发5.2 跳过…

【JavaSE】类和对象的封装

目录 【1】封装 【1.1】封装的概念 【1.2】访问限定符 【1.3】封装扩展之包 【1.3.1】包的概念 【1.3.2】导入包中的类 【1.3.3】自定义包 【1.3.4】包的访问权限控制举例 【1.3.5】常见的包 【2】static成员 【2.1】再谈学生类 【2.2】static修饰成员变量 【2.3】…

量子力学的应用:量子计算

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在前面的几篇文章中&#xff0c;我们已经深入探讨了量子力学的起源、基本概念、实验验证以及解释问题。今天&#xff0c;我们将聚焦在量子力学的一个引人注目的应用领域&#xff1a;量子计算。 1. 传统计算机与量子计…

【雕爷学编程】Arduino动手做(86)---4*4位 WS2812 全彩模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【图解CAN总线】-9-详述经典CAN和CANFD报文是如何收发的

目录 1 经典CAN/CANFD网络拓扑分解 2 CAN收发器“前后端的电平” 3 图解MCU芯片与CAN物理总线之间CAN报文收发过程 3.1 TX&#xff0c;RX和CAN H/L电平变化&#xff1a;ECU接收一个报文 3.2 TX&#xff0c;RX和CAN H/L电平变化&#xff1a;ECU发送一个报文 END 推荐阅读&…

【LeetCode】48.旋转图像

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]…

OPC通信从入门到精通_1_OPC基础知识及简单C#程序编写(OPCDA,OPCUA简介;OPC通信数据流框架图;C#程序编写)

文章目录 1. OPC基础知识&#xff1a;OPCDA&#xff0c;OPCUA1.1 OPC基础知识1.2 OPC通信读写方式 2. OPC通信仿真2.1 上位机与PLC通过ModbusTCP直接通信2.2 OPC通信介绍及实例2.2.1 OPC通信与ModbusTCP比较2.2.2 OPC通信应用场景2.2.3 OPC DA通信仿真实例2.2.4 OPC UA通信仿真…

随手笔记——3D−3D:ICP理论

随手笔记——3D−3D&#xff1a;ICP理论 说明SVD 方法非线性优化方法 说明 ICP 的求解也分为两种方式&#xff1a;利用线性代数的求解&#xff08;主要是 SVD&#xff09;&#xff0c;以及利用非线性优化方式的求解&#xff08;类似于 Bundle Adjustment&#xff09;。 SVD 方…

Android平台GB28181设备接入模块之按需编码和双码流编码

技术背景 我们在做执法记录仪或指挥系统的时候&#xff0c;会遇到这样的情况&#xff0c;大多场景下&#xff0c;我们是不需要把设备端的数据&#xff0c;实时传给国标平台端的&#xff0c;默认只需要本地录像留底&#xff0c;如果指挥中心需要查看前端设备实时数据的时候&…

【LeetCode热题100】打卡第44天:倒数第30~25题

文章目录 【LeetCode热题100】打卡第44天&#xff1a;倒数第30~25题⛅前言 移动零&#x1f512;题目&#x1f511;题解 寻找重复数&#x1f512;题目&#x1f511;题解 二叉树的序列化与反序列化&#x1f512;题目&#x1f511;题解 最长递增子序列&#x1f512;题目&#x1f5…