1. chunk是什么呢?
- Lua 执行的每一段代码,例如一个文件或交互模式下的一行代码,都是一个块。更具体地说,一个块只是一个语句序列。
- 分号可以可选地跟在任何语句之后。通常,我只使用分号来分隔写在同一行中的两个或多个语句,但这只是一个约定。
- 在交互模式下,Lua 通常将您键入的每一行解释为一个完整的块。然而,如果它检测到该行不能形成一个完整的块,它会等待更多的输入,直到它有一个完整的块。当 Lua 等待一行继续时,它会显示不同的提示(通常是>>)。factorial因此,您可以直接在交互模式下输入多行定义,例如函数。然而,有时将这些定义放在一个文件中,然后调用 Lua 来运行该文件会更方便。
- 由chunk的定义我们可以看出chunk的解析应该是
```
while(条件){
statment(ls);
testnext(ls, ';'); // 判断下一个是不是';'如果是就跳过
}
```
2. 什么是statement?
- statement是构成lua的代码单元块,lua脚本由一系列的statement构成的序列组合而成可以是由if、while、do、for、repeat、func、local、return、break、expr等类别
```
// lua5.1 lparser.c
static int statement(LexState *ls)
{
switch (ls->t.token)
{
case TK_IF:
'''
case TK_WHILE:
'''
case TK_DO:
'''
case TK_FOR:
'''
case TK_REPEAT:
'''
case TK_FUNCTION:
'''
case TK_LOCAL:
'''
case TK_RETURN:
'''
case TK_BREAK:
'''
default:
{
exprstat(ls);
}
}
}
```
- ## 2.1 statement中的if类别
static void ifstat(LexState *ls, int line)
{
FuncState *fs = ls->fs;
int flist;
int escapelist = NO_JUMP;
flist = test_then_block(ls); // 解析if 之后到下一个elseif/else之间的东西
while (ls->t.token == TK_ELSEIF)
{
flist = test_then_block(ls); // 解析elseif 之后到下一个elseif之间的东西
}
if (ls->t.token == TK_ELSE)
{
block(ls); /* `else' part */
}
}
- if 语句的解析
- if的构成一般由
if cond then elseif cond then else end
构成
- if的构成一般由
- 在test_then_block中 会尝试解析 if/elseif 之后的内容
static int test_then_block(LexState *ls) { int condexit; condexit = cond(ls); block(ls); /* `then' part */ return condexit; }
- 一般在if /elseif 之后,我们会得到一个表达式 对应 是否符合条件,那么我们可以猜想 cond(ls)的构成应该是
expr(ls, &v) 看看解析的值是true还是false
- 解析完条件之后,就是条件之后的block了,每个block里面又可能包含各种各样的statement,那么就认为他们又是一个chunk重新解析
static void block(LexState *ls) { ''' chunk(ls); ''' }
-
到此一个简单的ifstat的解析过程我们就看完了
- ## 2.1 statement中的while类别
static void whilestat(LexState *ls, int line)
{
condexit = cond(ls); // 条件退出
checknext(ls, TK_DO); // 检查之后是不是do
block(ls); // 进入block块
check_match(ls, TK_END, TK_WHILE, line); // 检查之后是不是end
}
- while 语句的解析
- while的构成一般由
while (条件) do ''' end
构成
- while的构成一般由
- ## 2.1 statement中的do类别
static void dostat(LexState *ls, int line)
{
gafqX_next(ls);
block(ls); // 进入block块
check_match(ls, TK_END, TK_DO, line);
}
- do 语句的解析
- do的构成一般由
do ''' end
构成
- do的构成一般由