summaryrefslogtreecommitdiff
path: root/src/lua51/lparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua51/lparser.c')
-rw-r--r--src/lua51/lparser.c59
1 files changed, 39 insertions, 20 deletions
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);