From 0267168675cb21f19e685749e1737dfd2884bdf2 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy <roberto@inf.puc-rio.br> Date: Fri, 8 Jun 2001 09:29:27 -0300 Subject: details. --- lparser.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'lparser.c') diff --git a/lparser.c b/lparser.c index bd9b0b0b..78b91cd6 100644 --- a/lparser.c +++ b/lparser.c @@ -1,5 +1,5 @@ /* -** $Id: lparser.c,v 1.144 2001/06/05 19:27:32 roberto Exp roberto $ +** $Id: lparser.c,v 1.145 2001/06/07 14:44:51 roberto Exp roberto $ ** LL(1) Parser and code generator for Lua ** See Copyright Notice in lua.h */ @@ -492,16 +492,20 @@ static void recfield (LexState *ls, expdesc *t) { } +static int anotherfield (LexState *ls) { + if (ls->t.token != l_c(',')) return 0; + next(ls); /* skip the comma */ + return (ls->t.token != l_c(';') && ls->t.token != l_c('}')); +} + + static int recfields (LexState *ls, expdesc *t) { /* recfields -> recfield { `,' recfield } [`,'] */ - int n = 1; /* at least one element */ - recfield(ls, t); - while (ls->t.token == l_c(',')) { - next(ls); - if (ls->t.token == l_c(';') || ls->t.token == l_c('}')) break; + int n = 0; + do { /* at least one element */ recfield(ls, t); n++; - } + } while (anotherfield(ls)); return n; } @@ -514,13 +518,12 @@ static int listfields (LexState *ls, expdesc *t) { int reg; reg = fs->freereg; expr(ls, &v); - while (ls->t.token == l_c(',') && - (next(ls), (ls->t.token != l_c(';') && ls->t.token != l_c('}')))) { + while (anotherfield(ls)) { luaK_exp2nextreg(fs, &v); luaX_checklimit(ls, n, MAXARG_Bc, l_s("`item groups' in a list initializer")); if (n%LFIELDS_PER_FLUSH == 0) { - luaK_codeABc(fs, OP_SETLIST, t->u.i.info, n-1); + luaK_codeABc(fs, OP_SETLIST, t->u.i.info, n-1); /* flush */ fs->freereg = reg; /* free registers */ } expr(ls, &v); -- cgit v1.2.3-55-g6feb