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直接赋值就好了。