Roberto Ierusalimschy 28 years ago
parent
commit
4be18fa889
1 changed files with 27 additions and 60 deletions
  1. 27 60
      lua.stx

+ 27 - 60
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
 ** Syntax analizer and code generator
 ** See Copyright Notice in lua.h
 ** 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)
   if (!dots)
     code_oparg(ARGS, 0, currState->nlocalvar, currState->nlocalvar);
     code_oparg(ARGS, 0, currState->nlocalvar, currState->nlocalvar);
   else {
   else {
@@ -617,11 +618,10 @@ TProtoFunc *luaY_parser (ZIO *z, char *chunkname)
 %type <vLong> functioncall, expr  /* if != 0, points to function return
 %type <vLong> functioncall, expr  /* if != 0, points to function return
 					 counter */
 					 counter */
 %type <vInt>  varlist1, funcParams, funcvalue
 %type <vInt>  varlist1, funcParams, funcvalue
-%type <vInt>  fieldlist, localdeclist, decinit
+%type <vInt>  fieldlist, localnamelist, decinit
 %type <vInt>  ffieldlist, ffieldlist1, semicolonpart
 %type <vInt>  ffieldlist, ffieldlist1, semicolonpart
 %type <vInt>  lfieldlist, lfieldlist1
 %type <vInt>  lfieldlist, lfieldlist1
-%type <vInt>  parlist1, par
-%type <vLong> var, singlevar, funcname  /* vardesc */
+%type <vLong> var, funcname  /* vardesc */
 %type <pFunc> body
 %type <pFunc> body
 
 
 
 
@@ -646,8 +646,7 @@ statlist : /* empty */
 
 
 sc	 : /* 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
        | WHILE GetPC cond DO block END
        {{
        {{
@@ -676,17 +675,16 @@ stat   : IF cond THEN block SaveWord elsepart END
 	    left = lua_codestore(i, left);
 	    left = lua_codestore(i, left);
           adjuststack(left);  /* remove eventual 'garbage' left on stack */
           adjuststack(left);  /* remove eventual 'garbage' left on stack */
        }}
        }}
+
        | functioncall { adjust_functioncall($1, 0); }
        | functioncall { adjust_functioncall($1, 0); }
-       | LOCAL localdeclist decinit
+
+       | LOCAL localnamelist decinit
        {
        {
          currState->nlocalvar += $2;
          currState->nlocalvar += $2;
          adjust_mult_assign($2, $3);
          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
 block    : {$<vInt>$ = currState->nlocalvar;} chunk
@@ -701,7 +699,7 @@ funcname	: var { init_func(); $$ = $1; }
 		| varexp ':' NAME
 		| varexp ':' NAME
 	{
 	{
 	  code_string($3);
 	  code_string($3);
-          $$ = 0;  /* indexed variable */
+          $$ = 0;  /* flag indexed variable */
 	  init_func();
 	  init_func();
 	  add_localvar(luaS_new("self"));
 	  add_localvar(luaS_new("self"));
 	}
 	}
@@ -712,8 +710,7 @@ body :  '(' parlist ')' chunk END { $$ = close_func(); }
 
 
 elsepart : /* empty */
 elsepart : /* empty */
 	 | ELSE block
 	 | ELSE block
-         | ELSEIF cond THEN block SaveWord elsepart
-	{ codeIf($2, $5); }
+         | ELSEIF cond THEN block SaveWord elsepart { codeIf($2, $5); }
          ;
          ;
 
 
 ret	: /* empty */
 ret	: /* empty */
@@ -792,8 +789,7 @@ funcvalue    : varexp { $$ = 0; }
 	     }
 	     }
 	     ;
 	     ;
 
 
-funcParams :	'(' exprlist ')'
-	{ $$ = adjust_functioncall($2, 1); }
+funcParams :	'(' exprlist ')' { $$ = adjust_functioncall($2, 1); }
 	|	table  { $$ = 1; }
 	|	table  { $$ = 1; }
 	;
 	;
 
 
@@ -805,30 +801,18 @@ exprlist1 :  expr	{ if ($1 != 0) $$ = $1; else $$ = -1; }
 	  |  exprlist1 ',' { $<vLong>$ = adjust_functioncall($1, 1); } expr
 	  |  exprlist1 ',' { $<vLong>$ = adjust_functioncall($1, 1); } expr
 	{
 	{
 	  if ($4 == 0) $$ = -($<vLong>3 + 1);  /* -length */
 	  if ($4 == 0) $$ = -($<vLong>3 + 1);  /* -length */
-	  else
-	  {
+	  else {
             currState->f->code[$4] = $<vLong>3;  /* store list length */
             currState->f->code[$4] = $<vLong>3;  /* store list length */
 	    $$ = $4;
 	    $$ = $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
 fieldlist  : lfieldlist
   	     { flush_list($1/LFIELDS_PER_FLUSH, $1%LFIELDS_PER_FLUSH); }
   	     { flush_list($1/LFIELDS_PER_FLUSH, $1%LFIELDS_PER_FLUSH); }
@@ -838,10 +822,8 @@ fieldlist  : lfieldlist
 	     { $$ = $1; flush_record($1%RFIELDS_PER_FLUSH); }
 	     { $$ = $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 */
 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 '[' expr1 ']' { $$ = 0; }  /* indexed variable */
 	  |	varexp '.' NAME { code_string($3); $$ = 0; }/* ind. var. */
 	  |	varexp '.' NAME { code_string($3); $$ = 0; }/* ind. var. */
 	  ;
 	  ;
 		
 		
-singlevar :	NAME { $$ = singlevar($1, currState); }
-	  ;
-
 varexp	: var { lua_pushvar($1); }
 varexp	: var { lua_pushvar($1); }
 	| '%' NAME { pushupvalue($2); }
 	| '%' 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; }
 decinit	  : /* empty */  { $$ = 0; }
 	  | '=' exprlist1 { $$ = $2; }
 	  | '=' exprlist1 { $$ = $2; }