details
This commit is contained in:
87
lua.stx
87
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, funcname /* vardesc */
|
||||||
%type <vLong> var, singlevar, 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
|
stat : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); }
|
||||||
{ 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
|
|
||||||
{
|
| FUNCTION funcname body { func_onstack($3); storevar($2); }
|
||||||
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
|
| ELSEIF cond THEN block SaveWord elsepart { codeIf($2, $5); }
|
||||||
{ codeIf($2, $5); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
ret : /* empty */
|
ret : /* empty */
|
||||||
@@ -792,8 +789,7 @@ funcvalue : varexp { $$ = 0; }
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
funcParams : '(' exprlist ')'
|
funcParams : '(' exprlist ')' { $$ = adjust_functioncall($2, 1); }
|
||||||
{ $$ = adjust_functioncall($2, 1); }
|
|
||||||
| table { $$ = 1; }
|
| table { $$ = 1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -805,31 +801,19 @@ 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); }
|
parlist : /* empty */ { code_args(0, 0); }
|
||||||
| parlist1 { code_args($1); }
|
| DOTS { code_args(0, 1); }
|
||||||
|
| localnamelist { code_args($1, 0); }
|
||||||
|
| localnamelist ',' DOTS { code_args($1, 1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
parlist1 : par { $$ = $1; }
|
|
||||||
| parlist1 ',' par
|
|
||||||
{
|
|
||||||
if ($1)
|
|
||||||
luaY_error("invalid parameter list");
|
|
||||||
$$ = $3;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
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); }
|
||||||
semicolonpart
|
semicolonpart
|
||||||
@@ -838,10 +822,8 @@ fieldlist : lfieldlist
|
|||||||
{ $$ = $1; flush_record($1%RFIELDS_PER_FLUSH); }
|
{ $$ = $1; flush_record($1%RFIELDS_PER_FLUSH); }
|
||||||
;
|
;
|
||||||
|
|
||||||
semicolonpart : /* empty */
|
semicolonpart : /* empty */ { $$ = 0; }
|
||||||
{ $$ = 0; }
|
| ';' ffieldlist { $$ = $2; flush_record($2%RFIELDS_PER_FLUSH); }
|
||||||
| ';' ffieldlist
|
|
||||||
{ $$ = $2; flush_record($2%RFIELDS_PER_FLUSH); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
lastcomma : /* empty */
|
lastcomma : /* empty */
|
||||||
@@ -881,37 +863,22 @@ lfieldlist1 : expr1 {$$=1;}
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
varlist1 : var
|
varlist1 : var { $$ = 1; add_varbuffer($1, 0); }
|
||||||
{
|
| varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; }
|
||||||
$$ = 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;}
|
localnamelist : NAME {store_localvar($1, 0); $$ = 1;}
|
||||||
| localdeclist ',' NAME
|
| localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; }
|
||||||
{
|
;
|
||||||
store_localvar($3, $1);
|
|
||||||
$$ = $1+1;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
decinit : /* empty */ { $$ = 0; }
|
decinit : /* empty */ { $$ = 0; }
|
||||||
| '=' exprlist1 { $$ = $2; }
|
| '=' exprlist1 { $$ = $2; }
|
||||||
|
|||||||
Reference in New Issue
Block a user