Resolving and Binding

1 Semantic Analysis中的变量绑定解析

背景:当一个变量在一个循环里赋值100次。那么这个变量会被赋值100次。当=右侧是函数时,这非常没必要。这个可以通过静态的分析来避免这个问题。这个分析就是Sematic Analysis中的一个例子。

具体做的事情叫

2 把定义一个变量分成两步,声明 和 定义,的原因是解决如下问题。

此时我们选择第3个报错。

3 resolver这类要干什么?

我的理解:

静态扫描一下整个代码。记录在变量定义,或者赋值时,且此时右侧表达式是个变量时。这个变量在那个environment 那个变量里的链里是第几个节点。

解决这个问题:

4 这段代码不知道要干什么。

上面visitVariableExpr的expr 输入 是下图的initializer吗 可能是。当initializer是一个变量的时候就是。但如果是个函数,那么就不是。

确实这里的variable是个expr。它里面只存了变量的名字。

所以。图二这个initializer 可能是一个变量。也许是b 或者是c。但是反正不能是自己。也可能是别的表达式子。

5 这个helper 是干什么的?

原文解释:

这看起来很像 Environment 中评估变量的代码,这是有道理的。我们从最内层的作用域开始向外搜索,在每个映射中寻找匹配的名称。如果我们找到了变量,我们就解析它,同时传递当前最内层作用域与找到变量的作用域之间的作用域数目。因此,如果变量是在当前作用域中找到的,我们就输入 0;如果是在紧邻的外层作用域中,我们就输入 1。

如果我们走遍了所有的代码块作用域,却始终没有找到变量,我们就会让它悬而未决,并假定它是全局变量。我们稍后将讨论 resolve() 方法的实现。现在,让我们继续浏览其他语法节点。

我的理解:

大概明白了,其实还是在记录,下图的这个查找的次数。那就是在栈上,由外向内去寻找这个变量的定义。找到了最外面的,就直接返回了他所在栈的index。

这里还要看后面的resolve如何实现。

6 resolve asginment是为了什么?

和定义一个变量一样,也是要找到确定的那个右值变量。

6 resolve function的声明是为了什么?我猜也是为了里面的变量?不是为了变量。

这里function的声明也可以看作一个变量。

他也有variable一样的域的问题。和问题5 里面说的一样的问题。

resolve function可以让他明确指出用的是哪个function。

能看出来,他和variable不同。因为它可以递归调用自己。

7 还resolve了其他东西,就是为了遍历整个语法树。

感觉就是针对不同的stmt,遍历它里面的expr

以及各种Expr,如下

我感觉这段是为了凑字数 哈哈哈哈

这里都要把这些函数写上的原因是要想interpreter一样解析整颗语法树。

不能在某个节点停下来。

8 resolve 就是为了干这个的

让我们看看我们的解析器有什么用。每次访问变量时,它都会告诉解释器在当前作用域和变量定义的作用域之间有多少个作用域。在运行时,这正好对应于当前作用域和解释器可以找到变量值的外层作用域之间的环境数量。

但是为啥resolve的时候 和runtime的情况一致?

好问题 肯定是可以的。

下面可以看出来。虽然步会对for循环,但是block什么的谁在里面谁在外面这些是都会注意的

他只有在block 还有function的地方才会开新的scope。

什么时候解析?

他应该和interpret去遍历整个树的操作是一致的。所以才可以有同样的那个个数。

9 一般这个解析的结果会反到那个node里面。但是这个语言没有。

它放到一个map,方便ide解析。

10 为什么 Map<Expr, Integer> 足够?

你可能会认为我们需要某种嵌套树结构,以避免在有多个表达式引用同一变量时出现混乱,但每个表达式节点都是自己的 Java 对象,有自己的唯一标识。一个单一的映射不难将它们分开。

问题背景:

  • 我们使用 Map<Expr, Integer> 来存储解析过程中的信息,其中 Expr 是表示表达式的语法树节点,而 Integer 则表示这个表达式在当前作用域中相对于定义该变量的作用域的深度。
  • 变量名可以在不同的作用域中重复使用,表达式节点对应的是语法树中的具体位置,而不是变量的名字本身。

例子说明:

复制代码

var a = 10; { var a = 20; print a; }

这里有两个不同的 a 变量,分别处于不同的作用域:

  1. 第一层作用域(全局作用域):var a = 10;
  2. 第二层作用域(内部块作用域):var a = 20;print a;

对于解析器而言,它需要记录两个不同的 a 变量的作用域深度。在这种情况下,尽管变量名是相同的,解析器处理的是每个表达式节点,而不是变量名本身。

步骤:
  1. 在全局作用域定义变量 a,这时全局作用域中的 a 在深度为 0 的作用域中。
  2. 当进入内部块时,再次定义了变量 a,此时内部块中的 a 在深度为 1 的作用域中。
  3. 解析 print a; 时,解析器会知道它是在第二层作用域中,因此找到的是内部块中的 a,深度为 0

在语法树中,每个 a 都有自己的独立节点(Expr 对象),即使它们的变量名相同。在解析时,解释器可以分别为两个 Expr 对象记录其作用域深度:

  • 全局的 a 变量对应的表达式节点存储在 locals 中,深度为 0
  • 内部块作用域的 a 对应的表达式节点存储在 locals 中,深度为 1
  • 当遇到 print a 时,解析器根据当前的表达式节点(即 print a 中的 a),在 locals 中找到它的深度信息。
为什么 Map<Expr, Integer> 足够?
  • 每个表达式(Expr)在语法树中是一个独立的 Java 对象。即使两个表达式节点都引用了变量 a,它们在内存中是不同的 Expr 对象。所以我们可以将每个表达式和它的解析深度关联起来,而不需要担心同名变量的混淆。

  • 在这个例子中,虽然有两个 a,它们对应的 Expr 是不同的,分别代表不同作用域中的 a。解释器根据 Expr 对象的唯一性,将不同的作用域深度存储在 Map<Expr, Integer> 中,可以准确区分同名变量。

总结来说,Map<Expr, Integer> 足够的原因在于:每个表达式节点在语法树中都是独立的对象,因此不需要担心变量名称的冲突,直接通过表达式节点的引用来存储和查找作用域深度。

11 改变了interpreter 对variable 的expr visit方式。

原来是这样的

现在是这样的

上面就能保证在Environment的那个 节点上找到对应的值吗?environment变量是个自定义的类型。

明白了,这个就是干这个的

12 现在可以看到,这个点assign就是和get反着。下面这个会穿越几个链条去赋值。

13 同一block下,多个相同变量会报错

15 同时增加了在global写return会报错的功能。

这个resolver其实可以解决不少静态时,检查的功能。

感悟

其实还是针对variable和function来搞的  resolveFunction,visitVariableExpr

其他的不重要。

然后只有发现了block才会有新的scope。

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

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

相关文章

10.解析解方法推导线性回归——不容小觑的线性回归算法

引言 线性回归是许多复杂机器学习模型的基础。作为一种基本的机器学习方法&#xff0c;线性回归提供了清晰的思路和工具&#xff0c;通过理解其推导过程&#xff0c;可以更好地掌握机器学习的基本原理和模型设计。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.学会如…

对抗攻击的详细解析:原理、方法与挑战

对抗攻击的详细解析&#xff1a;原理、方法与挑战 对抗攻击&#xff08;Adversarial Attack&#xff09;是现代机器学习模型&#xff0c;尤其是深度学习模型中的一个关键安全问题。其本质在于&#xff0c;通过对输入数据添加精微的扰动&#xff0c;人类难以察觉这些扰动&#…

Cyber Weekly #25

赛博新闻 1、阿里云Qwen2.5发布&#xff01;再登开源大模型王座&#xff0c;Qwen-Max性能逼近GPT-4o 阿里云在云栖大会上宣布通义千问发布新一代开源模型Qwen2.5&#xff0c;开源旗舰模型Qwen2.5-72B性能超越Llama3.1-405B&#xff0c;再次登上全球开源大模型的王座&#xff…

【优选算法之二分查找】No.5--- 经典二分查找算法

文章目录 前言一、二分查找模板&#xff1a;1.1 朴素二分查找模板1.2 查找区间左端点模板1.3 查找区间右端点模板 二、二分查找示例&#xff1a;2.1 ⼆分查找2.2 在排序数组中查找元素的第⼀个和最后⼀个位置2.3 搜索插⼊位置2.4 x 的平⽅根2.5 ⼭脉数组的峰顶索引2.6 寻找峰值…

鸿蒙开发(NEXT/API 12)【跨设备互通NDK开发】协同服务

跨设备互通提供跨设备的相机、扫描、图库访问能力&#xff0c;平板或2in1设备可以调用手机的相机、扫描、图库等功能。 说明 本章节以拍照为例展开介绍&#xff0c;扫描、图库功能的使用与拍照类似。 用户在平板或2in1设备上使用富文本类编辑应用&#xff08;如&#xff1a;…

深入理解 flex-grow、flex-shrink、flex-basis

目录 1. Flex布局 2. flex-grow 计算方式 3. flex-shrink 计算公式 4. flex-basis 5. 应用场景 6. 总结 1. Flex布局 Flex 是 Flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性 flex属性是flex-grow, flex-shrink 和…

vscode安装ESLint与Vetur插件后自动修复代码不生效

vscode安装ESLint与Vetur插件后自动修复代码不生效 1、安装ESLint 和 Vuter 2、运行结果 2.1、代码保存时代码中的分号;能被检测出来,但是不会自动修复 2.2、手动运行ESLint 修复命令(在终端中执行 npx eslint . --fix)可以修复问题 3、解决办法 在.vscode目录下setti…

Spring Boot 3.x 配置 Spring Doc以及导入postman带图详解

一、pom.xml配置 <!-- API⽂档⽣成&#xff0c;基于swagger3 --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version></dependency>…

STL-set/multiset关联式容器

目录 一、常见接口 1.0 迭代器 1.1 构造函数 1.2 增删查 1.3 查找和统计 二、multiset 2.1 构造 2.2 查找 2.3 删除 2.4 统计 关联式容器是⽤来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;关联式容器逻辑结构通常是⾮线性结构&#xff0c;两个位置有紧密…

JSP分页功能实现案例:从基础到应用的全面解析

想要实现基于jsp的分页功能&#xff1a; 需要从数据库中获取数据&#xff0c;并在前端页面中分页展示 基于JDBC访问MySQL数据库&#xff0c;获取数据基于JSP处理数据并展示 本质上是JSP的一种开发模式&#xff08;即JSPJavaBean&#xff09; 第一步&#xff1a;创建JavaWeb项目…

gitlab 的CI/CD (二)

前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库&#xff08;产品库&#xff09;的脚本编写&#xff1b; 本文实现gitlab的ci/cd对远程服务器的操作&#xff1b; 介绍 要让Gitlab Runner部署到远程机器&#xff0c;远程机器必须信任gitlab runner账…

C++标准库容器类——string类

引言 在c中&#xff0c;string类的引用极大地简化了字符串的操作和管理&#xff0c;相比 C 风格字符串&#xff08;char*或cahr[]&#xff09;&#xff0c;std::string 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧&#xff01; 1.string 的构造…

一种WLAN用户综合认证系统及其方法(本人专利号 201110408124.X)

一种WLAN用户综合认证系统及其方法(本人专利号 201110408124.X&#xff09; 本发明公开了一种WLAN用户综合认证系统及其方法&#xff0c;涉及移动通信技术领域。本系统包括WLAN终端与AP子系统和外部认证中心&#xff1b;设置有认证协议分析引擎单元和用户综合控制单元&#xff…

c/c++内存管理(详解) + new与delete的用法及底层

1:c/c内存分布情况 1.1:c/c内存的分布图 1.2:每个区域的用途及不同类型变量存储在那个区 1.3:例题讲解 2:c动态内存管理方式(new delete) 2.1:new的语法 2.2:delete的语法 3:operator new函数与operator delete函数 4:new与delete的实现原理 5:定位new表达式初识 6:mallo…

python+selenium实现自动联网认证,并实现断网重连

pythonselenium实现自动联网认证&#xff0c;并实现断网重连 echo off python “E:\autoD\auto_login.py” 要使自动登录脚本在系统重启后自动运行&#xff0c;你可以使用Windows的任务计划程序来设置。以下是详细的步骤&#xff1a; 1. 保存脚本 首先&#xff0c;将你的Py…

【高分系列卫星简介——高分二号卫星(GF-2)】

高分二号卫星&#xff08;GF-2&#xff09; 高分二号&#xff08;GF-2&#xff09;卫星是中国自主研制的首颗空间分辨率优于1米的民用光学遥感卫星&#xff0c;具有亚米级空间分辨率、高定位精度和快速姿态机动能力等特点&#xff0c;达到了国际先进水平。以下是对高分二号卫星…

对Spring-AI系列源码的讲解

前言 今天&#xff0c;我们将开启对Spring-AI系列源码的讲解。请大家不急不躁&#xff0c;我会逐步深入&#xff0c;每次专注于一个知识点&#xff0c;以防让人感到困惑。 首先&#xff0c;源码的讨论自然离不开自动装配。有人可能会问&#xff0c;之前已经讲解过这个内容了&…

【JavaSE】八种基本数据类型及包装类

数据类型字节数位数值范围包装类默认值整型byte18-128&#xff0c;127Byte0short216&#xff0c;Short0int432&#xff0c;Integer0long864&#xff0c;Long0L浮点型float432Float0.0fdouble864Double0.0d布尔型boolean18true falseBooleanfalse字符型char2160&#xff0c;Char…

C++编程语言:基础设施:异常处理(Bjarne Stroustrup)

第 13 章 异常处理(Exception Handling) 目录 13.1 错误处理(Error Handling) 13.1.1 异常(Exceptions) 13.1.2 传统错误处理(Traditional Error Handling) 13.1.3 探索(Muddling Through) 13.1.4 异常的替代观点(Alternative Views of Exceptions) 13.1.4.1 异步…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境&#xff1a;Vulfocus(官方在线的无法使用&#xff0c;需要自己本地搭建) 官方手册&#xff1a;https://fofapr…