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模块里面的变量名可与外部函数中的变量名重复,但是要做好变量存取的处理。这个也不难,在执行这个块代块码前给这个闭包再增加一个用来存放局部变量的表,退出时删除即可。