导航:
编程语言是怎么构造的(一 四则混合运算的实现)
编程语言是怎么构造的(二 变量的定义和调用)
编程语言是怎么构造的(三 函数的定义和调用)
编程语言是怎么构造的(四 将语法分析和执行分离)
二 实现变量的功能
上一篇文章,我们实行了四则混合运算的功能。现在我们开始为它增加一个变量的功能。对于一个编程语言来说,变量是一个基本要素。
最终运行的效果是这样的:

准备工作
在DrRacket新建一个文件,file->New Tab,然后把上一遍文章我们的四则运算的代码打开。代码在https://gitee.com/zxbyh/scip/blob/master/R4/four-mixed-operations.rkt。代码的最前面加上 (require r5rs) 。

一 变量名的识别
目前我们的这个四则混合运算语言里面元素只有两个类型: 数字和操作符,因此符号就直接等于操作符了,但是现在我们加上变量了,那么符号就可能包含 操作符 和 变量名。因此要增加一个函数判断一个符号是否是一个变量名:

二 变量的存放和变量值的获取。
框架frame就是变量的容器,变量和值分别通过两个列表来存放,按位对应。并把这两个列表再放到一个列表里面,形式如下:

要检索变量的值就把变量表和值表都同时按位移动,找到变量后,那么这时的值表当前位置的元素也就是变量值了。

定义新变量的操作如下

三 变量定义语句的分析
接下来就需要我们的解释器能够 识别类似 (define x 1) 这样子的定义语句,然后从里面找到变量x 和变量的值 1,然后再利用上面的功能吧变量存放起。



这句现在还不能执行,我们接下来要修改m-eval 函数,参加框架的参数,这样才能从框架里面找到变量并执行。
四 代码块的分析
在修改m-eval函数之前,我们再做一件事情,我们目前的四则混合运算的代码都是一句表达式,现在我们进入变量后,就存在有变量定义和运算的多个表达式的情况了,这个叫代码模块。我们用 begin 来表示。

五 最后一步,m-eval函数加上框架参数
好了,到现在到最后一步了,修改一下m-eval函数。其实主要就是增加对 begin,define,变量的求值,并且将框架作为一个新增参数。

小结
本节看完后,要深入理解变量存放的框架,这个是下一阶段函数定义和调用的基础。
这一部分的代码请到此下载https://gitee.com/zxbyh/scip/blob/master/R4/four-mixed-operations-valuable.rkt,然后在自己电脑上运行。
接下来我们将进入第三阶段: 函数的定义和调用。
导航:
编程语言是怎么构造的(一 四则混合运算的实现)
编程语言是怎么构造的(二 变量的定义和调用)
编程语言是怎么构造的(三 函数的定义和调用)
编程语言是怎么构造的(四 将语法分析和执行分离)
网友评论