From 63cb4fbbb961da133c68865845eaf22d9b876700 Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 27 Sep 2020 20:31:53 +0800 Subject: *misc --- src/lua51/lparser.c | 59 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 20 deletions(-) (limited to 'src/lua51/lparser.c') diff --git a/src/lua51/lparser.c b/src/lua51/lparser.c index 7da34e7..d868981 100644 --- a/src/lua51/lparser.c +++ b/src/lua51/lparser.c @@ -140,6 +140,7 @@ static void checkname(LexState *ls, expdesc *e) { } +//c 注册一个局部变量,并返回对应的编号ID static int registerlocalvar (LexState *ls, TString *varname) { FuncState *fs = ls->fs; Proto *f = fs->f; @@ -157,13 +158,15 @@ static int registerlocalvar (LexState *ls, TString *varname) { new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n) +//c new_localvar() adjustlocalvars() removevars() 用来管理局部变量 + +//c 对于 local a,b,c = 1, 2,3 这样的语句,生成等号坐标对应的变量 static void new_localvar (LexState *ls, TString *name, int n) { FuncState *fs = ls->fs; - luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables"); - fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); + luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables");//最多支持200个局部变量 + fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); // } - static void adjustlocalvars (LexState *ls, int nvars) { FuncState *fs = ls->fs; fs->nactvar = cast_byte(fs->nactvar + nvars); @@ -172,7 +175,6 @@ static void adjustlocalvars (LexState *ls, int nvars) { } } - static void removevars (LexState *ls, int tolevel) { FuncState *fs = ls->fs; while (fs->nactvar > tolevel) @@ -380,22 +382,32 @@ static void close_func (LexState *ls) { } -//c! 编译生成字节码,分析阶段的唯一入口,返回proto指针 +//c!! 编译器入口 +//c! 词法分析>语法分析并生成字节码 +//c 编译生成字节码,分析阶段的唯一入口,返回proto指针 Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { + //c 词法分析、语法分析和代码生成过程中的数据都在这里 struct LexState lexstate; - struct FuncState funcstate; // 分析过程中的临时数据 + struct FuncState funcstate; + lexstate.buff = buff; luaX_setinput(L, &lexstate, z, luaS_new(L, name)); open_func(&lexstate, &funcstate); funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ - luaX_next(&lexstate); /* read first token */ - chunk(&lexstate); + + // lua通过一次遍历就从源代码生成了字节码,为了加快编译 + luaX_next(&lexstate); /* read first token */ + chunk(&lexstate); + + // 代码生成结束进行一些收尾工作 check(&lexstate, TK_EOS); close_func(&lexstate); + lua_assert(funcstate.prev == NULL); lua_assert(funcstate.f->nups == 0); lua_assert(lexstate.fs == NULL); - return funcstate.f; //c 最终生成的字节码 + + return funcstate.f; //c 最终生成的函数原型 } @@ -431,12 +443,12 @@ static void yindex (LexState *ls, expdesc *v) { ** ======================================================================= */ - +// 存放表消息 struct ConsControl { - expdesc v; /* last list item read */ - expdesc *t; /* table descriptor */ - int nh; /* total number of `record' elements */ - int na; /* total number of array elements */ + expdesc v; /* last list item read */ //表在构造过程中最后一个表达式的信息 + expdesc *t; /* table descriptor */ //表构造表达式的信息 + int nh; /* total number of `record' elements */ // 初始化表时,散列部分数据数量 + int na; /* total number of array elements */ // 初始化表时,数组部分数据数量 int tostore; /* number of array elements pending to be stored */ }; @@ -500,12 +512,15 @@ static void constructor (LexState *ls, expdesc *t) { /* constructor -> ?? */ FuncState *fs = ls->fs; int line = ls->linenumber; - int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); // 这条指令会被重定向,A参数会被设为寄存器上某个值 + struct ConsControl cc; cc.na = cc.nh = cc.tostore = 0; cc.t = t; + init_exp(t, VRELOCABLE, pc); init_exp(&cc.v, VVOID, 0); /* no value (yet) */ + luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ checknext(ls, '{'); do { @@ -594,12 +609,13 @@ static void body (LexState *ls, expdesc *e, int needself, int line) { } +//c 表达式 static int explist1 (LexState *ls, expdesc *v) { /* explist1 -> expr { `,' expr } */ int n = 1; /* at least one expression */ - expr(ls, v); + expr(ls, v); // 先生成lparser.h > expdesc结构 while (testnext(ls, ',')) { - luaK_exp2nextreg(ls->fs, v); + luaK_exp2nextreg(ls->fs, v); // 根据expdesc结构内容生成对应的字节码 expr(ls, v); n++; } @@ -725,6 +741,7 @@ static void primaryexp (LexState *ls, expdesc *v) { } +//构造表达式 static void simpleexp (LexState *ls, expdesc *v) { /* simpleexp -> NUMBER | STRING | NIL | true | false | ... | constructor | FUNCTION body | primaryexp */ @@ -1177,6 +1194,7 @@ static void localfunc (LexState *ls) { } +//c 定义局部变量语句 static void localstat (LexState *ls) { /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */ int nvars = 0; @@ -1191,8 +1209,8 @@ static void localstat (LexState *ls) { e.k = VVOID; nexps = 0; } - adjust_assign(ls, nvars, nexps, &e); - adjustlocalvars(ls, nvars); + adjust_assign(ls, nvars, nexps, &e); // 根据等号左右两边的个数调整,如果右边少于左边,则多余的置为nil + adjustlocalvars(ls, nvars); //根据变量数量调整FuncState结构中的nactvar,并调整startpc } @@ -1268,7 +1286,7 @@ static void retstat (LexState *ls) { luaK_ret(fs, first, nret); } - +//c 语法分析,直接生成字节码 static int statement (LexState *ls) { int line = ls->linenumber; /* may be needed for error messages */ switch (ls->t.token) { @@ -1332,6 +1350,7 @@ static void chunk (LexState *ls) { testnext(ls, ';'); lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && ls->fs->freereg >= ls->fs->nactvar); + // 更新寄存器的位置,给本地变量留位置 ls->fs->freereg = ls->fs->nactvar; /* free registers */ } leavelevel(ls); -- cgit v1.1-26-g67d0