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 */
    }
}
  1. if 语句的解析
    • if的构成一般由
      if cond then
      elseif cond then
      else
      end
      

      构成

  2. 在test_then_block中 会尝试解析 if/elseif 之后的内容
    static int test_then_block(LexState *ls)
    {
        int condexit;
        condexit = cond(ls);
        block(ls); /* `then' part */
        return condexit;
    }
    
  3. 一般在if /elseif 之后,我们会得到一个表达式 对应 是否符合条件,那么我们可以猜想 cond(ls)的构成应该是
    expr(ls, &v)
    看看解析的值是true还是false
    
    
  4. 解析完条件之后,就是条件之后的block了,每个block里面又可能包含各种各样的statement,那么就认为他们又是一个chunk重新解析
    static void block(LexState *ls)
    {
        '''
        chunk(ls);
        '''
    }
    
  5. 到此一个简单的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

}

  1. while 语句的解析
    • while的构成一般由
      while (条件) do
      '''
      end
      

      构成

  • ## 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);

}

  1. do 语句的解析
    • do的构成一般由
      do
      '''
      end
      

      构成

发表评论