Assignment

1 Statement 里面包含了Expression。

对Statement 的interpret 里面包含了 对Expression 的interpret。

2 Expression 可以下降出Assignment

3 单个token前瞻递归下降解析器在解析完左侧操作数并偶然发现 = 之前,无法看清是否在解析赋值。毕竟,在解析完左操作数后,我们才知道自己在解析一个 + 表达式。

不同之处在于,赋值的左侧不是一个求值表达式。它是一种伪表达式,会求值到一个可以赋值的 “东西”。如下

由于字段赋值的接收方可以是任何表达式,而表达式的长度可以随心所欲,因此可能需要花费大量的查找符才能找到 =。

我们只有一个token,并前瞻一下,我们应该做什么?

解析赋值表达式的大部分代码与其他二元运算符(如 +)的代码相似。我们解析左侧,它可以是任何优先级较高的表达式。如果找到 =,我们就解析右侧,然后将其全部打包到赋值表达式树节点中。

这个和binary的处理不同。binary都是循环, 因为可能1+1+1+1.。。。

assignment是右结合。a=b=c=d。 

4 根据assignment的代码,这个式子会报错。

因为a+b 左侧到最后,并不是Variable。

5 对于assignment,我们不会evaluate左侧的value。

如下,第二行我们不想得到"before"。而是想的到“evaluates” a to a storage location that you can assign into.

这也就是为啥 Expr.Assign node 左侧是个Token 而不是Expr。

如果不hit到=,我们不知道这是个l-value。

6 Assignment 最后需要返回赋值的值。

才能实现 下面的功能。

7 为了实现变量的作用域。代码实现的environment变成了一个链表。inner的environment都会指向outer的environment。

变量声明的时候,自动用最内侧的environment。

但是读取和赋值时,需要考虑链上的变量。

8 使用链式的环境Environment。

运行每个block的时候,都会新建一个environment变量,创建的同时,链接上外层environment。

开始this指的是外层的。try里面换成了新赋值的。

运行结束后,还会设置回来。用finally是为了异常抛出也会运行这句。

这个是在哪里开始嵌套的?

这里

几个问题:

1 expression是equality的例子有吗

2 Assignment 和equality 什么关系?

就是语法上等级挨着。没有其他关系。

原文:这就是说,赋值要么是一个标识符,后面跟一个 = 和一个值表达式,要么是一个相等表达式(以及任何其他表达式)。

有时把英文扔到翻译里,再看一遍就理解了。

3 declaration 和 assignment 什么关系

好像确实不一样。

declaration需要var在前面

assignment直接赋值就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值