From 4be18fa889657ebd317f5311ecf65da64891242b Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 15 Oct 1997 18:16:00 -0200 Subject: details --- lua.stx | 87 ++++++++++++++++++++--------------------------------------------- 1 file changed, 27 insertions(+), 60 deletions(-) diff --git a/lua.stx b/lua.stx index fb85d18f..112a6b40 100644 --- a/lua.stx +++ b/lua.stx @@ -1,6 +1,6 @@ %{ /* -** $Id: lua.stx,v 1.8 1997/10/06 14:51:11 roberto Exp roberto $ +** $Id: lua.stx,v 1.9 1997/10/13 22:12:04 roberto Exp roberto $ ** Syntax analizer and code generator ** See Copyright Notice in lua.h */ @@ -422,8 +422,9 @@ static void adjust_mult_assign (int vars, long exps) } -static void code_args (int dots) +static void code_args (int nparams, int dots) { + currState->nlocalvar += nparams; if (!dots) code_oparg(ARGS, 0, currState->nlocalvar, currState->nlocalvar); else { @@ -617,11 +618,10 @@ TProtoFunc *luaY_parser (ZIO *z, char *chunkname) %type functioncall, expr /* if != 0, points to function return counter */ %type varlist1, funcParams, funcvalue -%type fieldlist, localdeclist, decinit +%type fieldlist, localnamelist, decinit %type ffieldlist, ffieldlist1, semicolonpart %type lfieldlist, lfieldlist1 -%type parlist1, par -%type var, singlevar, funcname /* vardesc */ +%type var, funcname /* vardesc */ %type body @@ -646,8 +646,7 @@ statlist : /* empty */ sc : /* empty */ | ';' ; -stat : IF cond THEN block SaveWord elsepart END - { codeIf($2, $5); } +stat : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); } | WHILE GetPC cond DO block END {{ @@ -676,17 +675,16 @@ stat : IF cond THEN block SaveWord elsepart END left = lua_codestore(i, left); adjuststack(left); /* remove eventual 'garbage' left on stack */ }} + | functioncall { adjust_functioncall($1, 0); } - | LOCAL localdeclist decinit + + | LOCAL localnamelist decinit { currState->nlocalvar += $2; adjust_mult_assign($2, $3); } - | FUNCTION funcname body - { - func_onstack($3); - storevar($2); - } + + | FUNCTION funcname body { func_onstack($3); storevar($2); } ; block : {$$ = currState->nlocalvar;} chunk @@ -701,7 +699,7 @@ funcname : var { init_func(); $$ = $1; } | varexp ':' NAME { code_string($3); - $$ = 0; /* indexed variable */ + $$ = 0; /* flag indexed variable */ init_func(); add_localvar(luaS_new("self")); } @@ -712,8 +710,7 @@ body : '(' parlist ')' chunk END { $$ = close_func(); } elsepart : /* empty */ | ELSE block - | ELSEIF cond THEN block SaveWord elsepart - { codeIf($2, $5); } + | ELSEIF cond THEN block SaveWord elsepart { codeIf($2, $5); } ; ret : /* empty */ @@ -792,8 +789,7 @@ funcvalue : varexp { $$ = 0; } } ; -funcParams : '(' exprlist ')' - { $$ = adjust_functioncall($2, 1); } +funcParams : '(' exprlist ')' { $$ = adjust_functioncall($2, 1); } | table { $$ = 1; } ; @@ -805,30 +801,18 @@ exprlist1 : expr { if ($1 != 0) $$ = $1; else $$ = -1; } | exprlist1 ',' { $$ = adjust_functioncall($1, 1); } expr { if ($4 == 0) $$ = -($3 + 1); /* -length */ - else - { + else { currState->f->code[$4] = $3; /* store list length */ $$ = $4; } } ; -parlist : /* empty */ { code_args(0); } - | parlist1 { code_args($1); } - ; - -parlist1 : par { $$ = $1; } - | parlist1 ',' par - { - if ($1) - luaY_error("invalid parameter list"); - $$ = $3; - } +parlist : /* empty */ { code_args(0, 0); } + | DOTS { code_args(0, 1); } + | localnamelist { code_args($1, 0); } + | localnamelist ',' DOTS { code_args($1, 1); } ; - -par : NAME { add_localvar($1); $$ = 0; } - | DOTS { $$ = 1; } - ; fieldlist : lfieldlist { flush_list($1/LFIELDS_PER_FLUSH, $1%LFIELDS_PER_FLUSH); } @@ -838,10 +822,8 @@ fieldlist : lfieldlist { $$ = $1; flush_record($1%RFIELDS_PER_FLUSH); } ; -semicolonpart : /* empty */ - { $$ = 0; } - | ';' ffieldlist - { $$ = $2; flush_record($2%RFIELDS_PER_FLUSH); } +semicolonpart : /* empty */ { $$ = 0; } + | ';' ffieldlist { $$ = $2; flush_record($2%RFIELDS_PER_FLUSH); } ; lastcomma : /* empty */ @@ -881,37 +863,22 @@ lfieldlist1 : expr1 {$$=1;} } ; -varlist1 : var - { - $$ = 1; - add_varbuffer($1, 0); - } - | varlist1 ',' var - { - add_varbuffer($3, $1); - $$ = $1+1; - } +varlist1 : var { $$ = 1; add_varbuffer($1, 0); } + | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; } ; -var : singlevar { $$ = $1; } +var : NAME { $$ = singlevar($1, currState); } | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */ | varexp '.' NAME { code_string($3); $$ = 0; }/* ind. var. */ ; -singlevar : NAME { $$ = singlevar($1, currState); } - ; - varexp : var { lua_pushvar($1); } | '%' NAME { pushupvalue($2); } ; -localdeclist : NAME {store_localvar($1, 0); $$ = 1;} - | localdeclist ',' NAME - { - store_localvar($3, $1); - $$ = $1+1; - } - ; +localnamelist : NAME {store_localvar($1, 0); $$ = 1;} + | localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; } + ; decinit : /* empty */ { $$ = 0; } | '=' exprlist1 { $$ = $2; } -- cgit v1.2.3-55-g6feb