Lua语法分析(2)- 控制语句

欢迎关注公众号《后台开发探索之旅》。

 

 

上节回顾

上一节介绍了几个Lua EBNF范式,总结如下:

  1. chunk可表示为多条statement。

  2. statement可表示为两类,一类为if、for、return等控制语句,一类为exprstat(expression statement)表达式语句

  3. exprstat也分为两类,一类为func函数调用,一类为assignment赋值语句

  4. assignment将等号'='左边的作为primaryexp主表达式,将'='右边的作为explist1任意表达式

  5. primaryexp先获取prefixexp前缀表达式,再根据prefixexp后面的符号判断主表达式类型。

 

考虑到表达式有些复杂,本节主要介绍控制语句,从大家最熟悉的if语句开始。

 

 

ifstat

IF cond THEN
    block
{ELSEIF cond THEN block}
[ELSE block]
END

 

范例:

if a >= 80 then
    score = 'A'
elseif a >= 60 then
    score = 'B'
else 
    score = 'C'
end

ifstat语法比较直观,一目了然。

  • IF、THEN、ELSEIF、ELSE、END为终结符,对应这5个保留字。

  • cond为条件表达式,等价于 expr。

  • block为代码块,等价于chunk。

 

cond -> expr
block -> chunk

chunk为多条statement,block实际上也是多条statement,可以将block理解为带判断条件的chunk,所以在lua里block等同于chunk

 

 

whilestat

WHILE cond DO
    block
END

 

范例:

while a > 0 do
    a = a - 1
end

WHILE、DO、END为终结符,cond为条件表达式,block为代码块。

 

 

repeatstat

REPEAT 
    block 
UNTIL cond

 

范例:

repeat 
    a = a - 1
until a <= 0

类似于c语言的do while语句。

 

由于Lua不支持continue关键字,所以常常需要在循环体内,通过repeat + break来实现continue效果。

 

 

dostat

DO block END

 

范例:

do return end

 

由于Lua要求return语句必须为当前block的最后一条语句,例如下面语句会报错:

function f()
    return 
    print("call f()")
end

如果需要在中间位置return,必须用do return end语句,dostat生成一个新的block,return为block内的最后一条语句。如下:

function f()
    do return end 
    print("call f()")
end

 

 

forstat

FOR { fornum | forlist } END

 

for语句有两种形式:

  • fornum,类似c语言的计数方式。

  • forlist,类似python的枚举方式。

 

计数方式

fornum -> NAME = 
  exp1, exp1[,exp1] forbody
forbody -> DO block

范例:

for i=1, 10 do 
    a = a + i
end

 

等号'='左边为计数变量,右边为3个表达式,分别为初始计数、计数上限、递增步长。若没有第3个表达式,默认步长为1。

 

枚举方式

forlist -> NAME {, NAME} 
  IN explist1 forbody

范例:

t = {1, 2, 3, }
for i, v in ipairs(t) do 
    print(i, v)
end

 

IN为终结符,'IN'左边为枚举函数返回的两个值,右边为枚举表达式。

 

ipairs是Lua内置的枚举table函数,每次返回一个table元素的key和value,用户可以自定义枚举函数,实现遍历效果。

 

 

retstat 

RETURN [explist1]

 

范例:

return
return a, b
return f()

 

一次可以返回0到多个值,用可选的explist1表示多个返回结果。

 

本节介绍了控制语句相关的EBNF范式,可以看出控制语句就是expr和block的组合控制,敬请后续,欢迎留言!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值