commit 4be18fa889657ebd317f5311ecf65da64891242b
parent 7c261a13b572fb0f7449f6cdf2b495d0e5bd57d5
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 15 Oct 1997 18:15:39 -0200
details
Diffstat:
M | lua.stx | | | 87 | +++++++++++++++++++++++++------------------------------------------------------ |
1 file changed, 27 insertions(+), 60 deletions(-)
diff --git 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 <vLong> functioncall, expr /* if != 0, points to function return
counter */
%type <vInt> varlist1, funcParams, funcvalue
-%type <vInt> fieldlist, localdeclist, decinit
+%type <vInt> fieldlist, localnamelist, decinit
%type <vInt> ffieldlist, ffieldlist1, semicolonpart
%type <vInt> lfieldlist, lfieldlist1
-%type <vInt> parlist1, par
-%type <vLong> var, singlevar, funcname /* vardesc */
+%type <vLong> var, funcname /* vardesc */
%type <pFunc> 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 : {$<vInt>$ = 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 ',' { $<vLong>$ = adjust_functioncall($1, 1); } expr
{
if ($4 == 0) $$ = -($<vLong>3 + 1); /* -length */
- else
- {
+ else {
currState->f->code[$4] = $<vLong>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; }