lua2.1 语法解析过程(3)

本文深入解析Lua语言中的关键语句,包括if、while、repeat等的语法构造及执行流程,并探讨了多变量赋值和函数调用作为语句时的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在“lua2.1 语法解析过程(2)(编辑中)”一文中我们分析了表达式expr,接下来在本文中将分析另外一个重要的非终结符:stat --语句。

 

stat -> stat1 忽略

 


 

 

stat1 -> if expr1 then PrepJump block PrepJump elsepart end

一个小小的if语句看似简单,但是在语法构造上却如此复杂。if语句的核心在于“跳转”,上面的文法中有两个跳转点,假设有语句

"if (e) then A else B end",那么第一个跳转点就是为了越过block A,第二个跳转点是为了跳过block B。

 

elsepart -> else block | else cond then PrepJump block elsepart

和if语句的分析大同小异,将else部分独立出来是为了解决编译原理中的经典问题:“文法的二义性”。

 


 

stat1 -> while expr1 do PrepJump block PrepJump end

while语句的关键同样是跳转,不过和if语句不同的是它有向后跳转的情况以实现循环。如语句"while e do A end",第一个跳转点

是在执行e之后,如果结果为false,那么将直接跳出while语句。第二个跳转点紧跟在A的后面,这个跳转是一个无条件跳转,它将跳到e

指向之前。

 


 

stat1 -> repeat block until cond PrepJump

repeat 语句的关键同样是跳转,它只有一个跳转点,而且是一个条件跳转,cond执行的结果为false的时候会跳回到block之前。

 


 

varlist1 = exprlist1

脚本语言中的一个比较有趣的点:一条语句分别对多个变量赋值,这个产生式就是为了实现这个功能的描述。

 

例子1,如下面语句:

 

a, b = 1, 2;

a, b = 1;

a, b = 1, 2, 3

 

 

产生的指令为:

 

CODE

0    PUSH1

1    PUSH2

2    STOREGLOBAL   51

5    STOREGLOBAL   50

8    PUSH1

10    ADJUST   2

11    STOREGLOBAL   51

14    STOREGLOBAL   50

17    PUSH1

18    PUSH2

20    PUSHBYTE   3

22    ADJUST   2

23    STOREGLOBAL   51

26    STOREGLOBAL   50

29    RETCODE0

 

 

第二种情况(补充nil)下会多出一个ADJUST 2指令,是为了调整等式的左右两边的数数量上的一致,这个指令的一个

副作用是会将nil对象赋予b。

第三种情况(截断多余)下也会多出一个ADJUST 2指令,和上一个不同的是它将最后一个数字3给阶段。

 

例子2,如下语句:

 

function func(a)

return a;

end

 

a, b, c = 1, func(1);

a, b, c = func(1), 1;

a, b, c = func(1);

 

 

产生的指令有:

 

CODE

0    PUSH1

1    PUSHGLOBAL   51

4    PUSH1

5    CALLFUNC 1 2

8    STOREGLOBAL   53

11    STOREGLOBAL   52

14    STOREGLOBAL   50

17    PUSHGLOBAL   51

20    PUSH1

21    CALLFUNC 1 1

24    PUSH1

26    ADJUST   3

27    STOREGLOBAL   53

30    STOREGLOBAL   52

33    STOREGLOBAL   50

36    PUSHGLOBAL   51

39    PUSH1

40    CALLFUNC 1 3

43    STOREGLOBAL   53

46    STOREGLOBAL   52

49    STOREGLOBAL   50

52    RETCODE0

 

 

第一种情况比较理想,func(1)会主动地返回两个值。

第二种情况func(1)只会返回一个值,也就是函数的返回值数量和其位置有比较大的关系。

第三种情况func会返回3个值。

 


 

stat1 -> functioncall

之前也说过functioncal会在表达式和语句中出现,而在语句中出现的话他的返回值数量一定是0.

 


 

stat1 -> local localdeclist decinit

varlist = exprlist1类似只 不过varlist中的变量会多出一个属性:它们都是局部变量。

Lua开发包是Script.NET脚本语言开发平台的Lua插件,必须先安装Script.NET平台V2.1.1版本,然后再安装此开发包。 Script.NET平台下载地址:http://download.csdn.net/source/1034307 http://www.blueantstudio.net/scriptnet/download/download.htm Script.NET是蓝蚂蚁工作室开发的一套用于Tcl/Python/Ruby/Lua/NSIS 等脚本语言开发的集成开发环境,刚刚发布的2.1.1版本新增了Ruby脚本的支持,可以支持Ruby脚本的开发、调试、生成可执行文件、控制台等功能,可以支持wxRuby、RubyTk等界面库,目前还不支持Rails的调试,后续版本会不断完善。 下载地址和详细介绍请请参考蓝蚂蚁工作室的主页: http://www.blueantstudio.net Script.NET主要功能特性如下: 1、编辑、调试、运行tcl、python、lua、ruby脚本2脚本的编译/加密和生成可执行文件(每种脚本语言支持的程度不同); 3、效率分析等辅助功能(目前只有tcl脚本支持了此功能); 4、关键字帮助,通过F1键或鼠标移动到关键字上,获取详细的帮助信息; 5、收集了较多的脚本扩展包、帮助文档和演示程序,目前tcl的扩展包收集较多,其他脚本也正在收集完善,除了常用的tk、wx、pmw,还有图象、多媒体、界面库等很多各种各样的扩展包,以后我们打算通过在线更新的方式使用户可以更方便的获取到各种扩展包; 6、附带了ftp、代码统计、正则表达式等一些扩展工具; 7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; 8、支持控制台功能(目前支持tcl/python/lua/ruby控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); 9、Script.NET作为一个通用平台对外提供了很多接口,可以通过脚本等方式调用平台的各种功能,其中的tcl语言支持很多平台扩展命令,可以通过tcl操纵平台的各种功能,对平台进行扩展; 10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值