From cff22f57ddb6ff65edc7d8bac323f8c7af10c668 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 6 Jun 2002 10:52:37 -0300 Subject: [PATCH] some refactoring --- lparser.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/lparser.c b/lparser.c index 9d0bc4d9..5e9bcc30 100644 --- a/lparser.c +++ b/lparser.c @@ -1,5 +1,5 @@ /* -** $Id: lparser.c,v 1.185 2002/06/03 14:09:57 roberto Exp roberto $ +** $Id: lparser.c,v 1.186 2002/06/06 13:16:02 roberto Exp roberto $ ** Lua Parser ** See Copyright Notice in lua.h */ @@ -107,8 +107,11 @@ static void check_match (LexState *ls, int what, int who, int where) { static TString *str_checkname (LexState *ls) { + TString *ts; check_condition(ls, (ls->t.token == TK_NAME), " expected"); - return ls->t.seminfo.ts; + ts = ls->t.seminfo.ts; + next(ls); + return ts; } @@ -126,7 +129,6 @@ static void codestring (LexState *ls, expdesc *e, TString *s) { static void checkname(LexState *ls, expdesc *e) { codestring(ls, e, str_checkname(ls)); - next(ls); } @@ -204,7 +206,7 @@ static void markupval (FuncState *fs, int level) { } -static void singlevar (FuncState *fs, TString *n, expdesc *var, int base) { +static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { if (fs == NULL) /* no more levels? */ init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ else { @@ -215,7 +217,7 @@ static void singlevar (FuncState *fs, TString *n, expdesc *var, int base) { markupval(fs, v); /* local will be used as an upval */ } else { /* not found at current level; try upper one */ - singlevar(fs->prev, n, var, 0); + singlevaraux(fs->prev, n, var, 0); if (var->k == VGLOBAL) { if (base) var->info = luaK_stringK(fs, n); /* info points to global name */ @@ -229,6 +231,11 @@ static void singlevar (FuncState *fs, TString *n, expdesc *var, int base) { } +static void singlevar (LexState *ls, expdesc *var, int base) { + singlevaraux(ls->fs, str_checkname(ls), var, base); +} + + static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { FuncState *fs = ls->fs; int extra = nvars - nexps; @@ -597,15 +604,13 @@ static void prefixexp (LexState *ls, expdesc *v) { return; } case TK_NAME: { - singlevar(ls->fs, str_checkname(ls), v, 1); - next(ls); + singlevar(ls, v, 1); return; } case '%': { /* for compatibility only */ next(ls); /* skip `%' */ - singlevar(ls->fs, str_checkname(ls), v, 1); + singlevar(ls, v, 1); check_condition(ls, v->k == VUPVAL, "global upvalues are obsolete"); - next(ls); return; } default: { @@ -1018,10 +1023,8 @@ static void forlist (LexState *ls, TString *indexname) { new_localvarstr(ls, "(for generator)", nvars++); new_localvarstr(ls, "(for state)", nvars++); new_localvar(ls, indexname, nvars++); - while (testnext(ls, ',')) { + while (testnext(ls, ',')) new_localvar(ls, str_checkname(ls), nvars++); - next(ls); - } check(ls, TK_IN); line = ls->linenumber; adjust_assign(ls, 3, explist1(ls, &e), &e); @@ -1047,7 +1050,6 @@ static void forstat (LexState *ls, int line) { enterblock(fs, &bl, 1); next(ls); /* skip `for' */ varname = str_checkname(ls); /* first variable name */ - next(ls); /* skip var name */ switch (ls->t.token) { case '=': fornum(ls, varname, line); break; case ',': case TK_IN: forlist(ls, varname); break; @@ -1099,7 +1101,6 @@ static void localstat (LexState *ls) { next(ls); /* skip LOCAL */ do { new_localvar(ls, str_checkname(ls), nvars++); - next(ls); /* skip var name */ } while (testnext(ls, ',')); if (testnext(ls, '=')) nexps = explist1(ls, &e); @@ -1115,11 +1116,9 @@ static void localstat (LexState *ls) { static int funcname (LexState *ls, expdesc *v) { /* funcname -> NAME {field} [`:' NAME] */ int needself = 0; - singlevar(ls->fs, str_checkname(ls), v, 1); - next(ls); /* skip var name */ - while (ls->t.token == '.') { + singlevar(ls, v, 1); + while (ls->t.token == '.') luaY_field(ls, v); - } if (ls->t.token == ':') { needself = 1; luaY_field(ls, v); @@ -1261,11 +1260,10 @@ static void parlist (LexState *ls) { if (ls->t.token != ')') { /* is `parlist' not empty? */ do { switch (ls->t.token) { - case TK_DOTS: dots = 1; break; + case TK_DOTS: dots = 1; next(ls); break; case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; default: luaX_syntaxerror(ls, " or `...' expected"); } - next(ls); } while (!dots && testnext(ls, ',')); } code_params(ls, nparams, dots);