自制编程语言CXScript(三) 如何实现if语句、else语句并实现分支跳转

时间:2024-05-21 12:24:26

上回书说到赋值语句的实现,今天说说下一个重要语句,if

 

if是判断分支,主要是为了实现:

 

如果小鱼干价格 <10 

                那么做 ……

结束判断

 

这样的事情。在条件不满足的情况下,则将跳过第二句内容。

 

但是,实际上还不止这么简单,还有更多的需求:

 

如果 小鱼干价格> 20

        那么买 3

又如果 小鱼干价格> 10

        那么买4

再如果 小鱼干价格 > 5

        那么买6

其他

        那么买10

结束判断

 

这其实就是一条if语句。

 

晕。

 

实现的效果就是:

 

当小鱼干价格在20以上,买3条;

小鱼干价格10~20范围内,买4条;

小鱼干价格5~10范围内,买6条;

小鱼干价格5以下,买10条;

 

信不信?不信你回去照着看。

 

嗯,为了简单起见,目前只能计算等式和不等式,而不支持更多的与运算和或运算(因为这可以通过嵌套if实现)。

 

刚才的代码现在就可以写成:

 

if price > 20

    let count = 3

else if price > 10 

    let count = 4

else if price > 5

    let count = 6

else 

    let count = 10

end if

 

好了,这样你就学会了if语句。可以去给主子买鱼了:

 自制编程语言CXScript(三) 如何实现if语句、else语句并实现分支跳转

 

如何实现,就是程序猿的事情了。非程序猿该止步了。

 

由于已经实现了对应if语句的扫描和识别,所以现在需要做的,就是计算if 等式左右两边的值,然后计算结果了:

 自制编程语言CXScript(三) 如何实现if语句、else语句并实现分支跳转

 

比如刚刚的

price > 20

 

这里将会通过正则匹配左边的变量,并计算其值,而后获得右边的值,计算字面值为20。再通过符号对比,得出左右结果:

 自制编程语言CXScript(三) 如何实现if语句、else语句并实现分支跳转

在通过if语句的条件判断时,则将进入到对应的if块,否则,将选择跳过

 

这里跳过要能跳过嵌套的if块,所以不能见到地找下一个end if块,而要找到对应层级下的end if块。所以自然要用到栈来查找:

 自制编程语言CXScript(三) 如何实现if语句、else语句并实现分支跳转

 

statementType就是对应的语句类型,比如ifswitch语句。

 

在找到对应的if/switch时,就push进对应的语句类型;找到end if或者end switch时,则对应pop掉。

 

你看,为了方便,特地加了许多不必要的文法,使得这个越来越像……Pascal或者vb

 

在条件满足后,将跳过后续的else if或者else,在条件不满足时,则将选择其中的else if 或者else 的分支。这个思路很重要,因为它保持了if满足后跳转和不满足的跳转的统一处理。

 

在这样的想法的指引下,虽然遇到了很多的坑,但是至少程序能识别if语句并判断条件、跳转到对应语句了。

 

但是,一如既往的,还是存在bug。还是空格引发的bug

 

比如 

if a      >       b

if a >b

 

就出现了两种形式的空格,在扫描计算的时候出了点问题。还有可能出tab……好吧,继续加油。