diff -ru lua-4.0/src/lparser.c lua-4.0-constructors/src/lparser.c --- lua-4.0/src/lparser.c Fri Oct 27 13:39:52 2000 +++ lua-4.0-constructors/src/lparser.c Sun Dec 16 16:44:47 2001 @@ -484,6 +484,7 @@ static void recfield (LexState *ls) { /* recfield -> (NAME | '['exp1']') = exp1 */ + /* recfield -> FUNCTION funcname body */ switch (ls->t.token) { case TK_NAME: { luaK_kstr(ls, checkname(ls)); @@ -495,7 +496,14 @@ check(ls, ']'); break; } - default: luaK_error(ls, " or `[' expected"); + case TK_FUNCTION: { + int line = ls->linenumber; + next(ls); + luaK_kstr(ls, checkname(ls)); + body(ls, 0, line); + return; + } + default: luaK_error(ls, ", `function' or `[' expected"); } check(ls, '='); exp1(ls); @@ -503,12 +511,12 @@ static int recfields (LexState *ls) { - /* recfields -> recfield { ',' recfield } [','] */ + /* recfields -> recfield { [','] recfield } [','] */ FuncState *fs = ls->fs; int n = 1; /* at least one element */ recfield(ls); - while (ls->t.token == ',') { - next(ls); + for (;;) { + optional(ls, ','); if (ls->t.token == ';' || ls->t.token == '}') break; recfield(ls); @@ -550,9 +558,11 @@ cd->k = ls->t.token; break; } + case TK_FUNCTION: case TK_NAME: { /* may be listfields or recfields */ lookahead(ls); - if (ls->lookahead.token != '=') /* expression? */ + /* '=' or 'function' */ + if (ls->lookahead.token != '=' && ls->lookahead.token != TK_NAME) goto case_default; /* else go through to recfields */ }

AltStyle によって変換されたページ (->オリジナル) /