一步步写lua解释器--if else语句

if 语句可以拆成三个部分:
逻辑判断部分,if 左边的部分,if右边部分,例如:

if b == 1 then
    local c = 100 
    print(c)
else 
    print(2)
end

b==1为逻辑判断部分
local c=100 print(c)为if左边部分,print(2)为右边部分
如果if 没有else 则右边部分为空。对于

if a then A 
elseif b then B
elseif c then C 
...
else D

则可以看作是if语句的嵌套。a为最外层if语句的逻辑判断部分,A为左边部分,剩下的elseif等全为最外层if语句的右边部分。嵌套的第二个if的逻辑判断部分是b,左边部分是B,剩下为右边部分。。。这样无论是代码解析还是代码生成都可以用递归的方式来做,比较清晰易懂。

生成if语句代码时,先生成右边部分代码(如果有的话),然后是左边部分,最后是逻辑判断部分。这样做的话,逻辑判断的值则在栈顶,然后依次是左边部分,右边部分。最好给指令加一个附加参数来说明是否有右边部分代码,虽然可以通过栈的大小来判断是否有右值部分,但是万一代码某个部分没有处理好,栈没有平衡,容易造成翻车。取出栈顶值,左边值,右边值,然后判断如果逻辑值为true则,执行左边部分,否则执行右边部分。

左边部分和右边部分的处理类似于生成闭包代码,将生成的块代码保存在一个值上,然后推入栈中,等到要执行(逻辑判断执行左边还是右边的代码块)时才去执行该代码块。不过我看其他人实现的思路好像不是这样的,大都使用了跳转指令。不知道我这样做有没有缺陷,或者效率上的损失,您要是知道可以在下面留言。

还有个问题是,if语句中的代码块相当于进入了一个新的作用域,也就是说if模块里面的变量名可与外部函数中的变量名重复,但是要做好变量存取的处理。这个也不难,在执行这个块代块码前给这个闭包再增加一个用来存放局部变量的表,退出时删除即可。

 

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值