上回书说到赋值语句的实现,今天说说下一个重要语句,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语句。可以去给主子买鱼了:
如何实现,就是程序猿的事情了。非程序猿该止步了。
由于已经实现了对应if语句的扫描和识别,所以现在需要做的,就是计算if 等式左右两边的值,然后计算结果了:
比如刚刚的
price > 20
这里将会通过正则匹配左边的变量,并计算其值,而后获得右边的值,计算字面值为20。再通过符号对比,得出左右结果:
在通过if语句的条件判断时,则将进入到对应的if块,否则,将选择“跳过”。
这里跳过要能跳过嵌套的if块,所以不能见到地找下一个end if块,而要找到对应层级下的end if块。所以自然要用到栈来查找:
statementType就是对应的语句类型,比如if、switch语句。
在找到对应的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……好吧,继续加油。