一步步写lua解释器--数值for循环

lua中for语句分为数值型for循环和泛型for循环。其中数值型for较为简单,我们先说它。

数值型for循环的要点:

for var=exp1,exp2,exp3 do  
    <执行体>  
end
例如:
for i = 1, 2,1  do 
    print(i)
end

需要特别注意的是,其中变量i是这个for循环体的局部变量,也就是说这个i在for循环外面不可见。同时要注意的是,这个i的值虽然被修改,但是并不改变循环操作,也就是说,循环多少次for语句开始的时候就决定了,循环体里面修改i并没有作用,仅仅只对循环体中的i生效。

数值型for循环比较好实现,因为他无法是一些简单表达式代码的组合。获取到exp1作为iStart, exp2作为iEnd,exp3作为iStep,我们就可以用c语言for循环执行代码了。需要注意的是,exp3有可能为空,这个解析时就可以写在指令里。还有,获取exp时就应该进入一个block中,因为i是对外不可见的。

对了,居然忘了for循环可以break了,break的实现也折腾了好一会,终于好了。在后面会讲到,每个块的代码都属于InstructionValue,当然函数也是。遇到InstructionValue时,会调用runcode,显然这样会嵌套递归调用。我们在每个InstructionValue变量设置一个breaked标志,如果遇到break指令,则将break标志置为true。这样是不严谨的,因为break一般不直接出现在for循环模块下,而是出现在if else模块下,所以还需要往上查找到有for模块的InstructionValue,将他们的break都设为true。当然找不到的话,那就表明出错误了,因为break语句只能出现在循环中。当然我们应该在语法层面就检测到这个错误,而不是等到执行虚拟机才报错。

虽然lua里面没有continue语句,按照上面的思路continue语句应该也可以实现了,有空可以测试一下,先把剩下的写完。for循环还有泛型for循环,应该有点难度,加油,下篇继续。

 

有问题可以在下面留言,或者加入QQ群 858791125 讨论。

项目地址:
https://github.com/shonm520/mlua

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值