|
|
@ -1,6 +1,6 @@ |
|
|
|
%{ |
|
|
|
|
|
|
|
char *rcs_luastx = "$Id: lua.stx,v 3.4 1994/11/09 18:07:38 roberto Exp roberto $"; |
|
|
|
char *rcs_luastx = "$Id: lua.stx,v 3.5 1994/11/13 14:54:18 roberto Exp roberto $"; |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
#include <stdlib.h> |
|
|
@ -9,6 +9,7 @@ char *rcs_luastx = "$Id: lua.stx,v 3.4 1994/11/09 18:07:38 roberto Exp roberto $ |
|
|
|
#include "opcode.h" |
|
|
|
#include "hash.h" |
|
|
|
#include "inout.h" |
|
|
|
#include "tree.h" |
|
|
|
#include "table.h" |
|
|
|
#include "lua.h" |
|
|
|
|
|
|
@ -40,6 +41,7 @@ static int nlocalvar=0; /* number of local variables */ |
|
|
|
static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ |
|
|
|
static int nfields=0; |
|
|
|
|
|
|
|
|
|
|
|
/* Internal functions */ |
|
|
|
|
|
|
|
static void code_byte (Byte c) |
|
|
@ -164,17 +166,6 @@ static void code_number (float f) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void init_function (void) |
|
|
|
{ |
|
|
|
if (funcCode == NULL) /* first function */ |
|
|
|
{ |
|
|
|
funcCode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); |
|
|
|
if (funcCode == NULL) |
|
|
|
lua_error("not enough memory"); |
|
|
|
maxcode = CODE_BLOCK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
%} |
|
|
|
|
|
|
@ -187,6 +178,7 @@ static void init_function (void) |
|
|
|
Word vWord; |
|
|
|
Long vLong; |
|
|
|
Byte *pByte; |
|
|
|
TreeNode *pNode; |
|
|
|
} |
|
|
|
|
|
|
|
%start functionlist |
|
|
@ -198,8 +190,8 @@ static void init_function (void) |
|
|
|
%token LOCAL |
|
|
|
%token FUNCTION |
|
|
|
%token <vFloat> NUMBER |
|
|
|
%token <pChar> STRING |
|
|
|
%token <pChar> NAME |
|
|
|
%token <vWord> STRING |
|
|
|
%token <pNode> NAME |
|
|
|
%token <vInt> DEBUG |
|
|
|
|
|
|
|
%type <vLong> PrepJump |
|
|
@ -208,7 +200,7 @@ static void init_function (void) |
|
|
|
%type <vInt> ffieldlist1 |
|
|
|
%type <vInt> lfieldlist1 |
|
|
|
%type <vLong> var, singlevar |
|
|
|
|
|
|
|
%type <pByte> body |
|
|
|
|
|
|
|
%left AND OR |
|
|
|
%left EQ NE '>' '<' LE GE |
|
|
@ -239,84 +231,54 @@ functionlist : /* empty */ |
|
|
|
|
|
|
|
function : FUNCTION NAME |
|
|
|
{ |
|
|
|
init_function(); |
|
|
|
pc=0; basepc=funcCode; maxcurr=maxcode; |
|
|
|
nlocalvar=0; |
|
|
|
$<vWord>$ = lua_findsymbol($2); |
|
|
|
} |
|
|
|
'(' parlist ')' |
|
|
|
{ |
|
|
|
if (lua_debug) |
|
|
|
{ |
|
|
|
code_byte(SETFUNCTION); |
|
|
|
code_code((Byte *)strdup(lua_file[lua_nfile-1])); |
|
|
|
code_word($<vWord>3); |
|
|
|
} |
|
|
|
lua_codeadjust (0); |
|
|
|
init_function($2); |
|
|
|
} |
|
|
|
block |
|
|
|
END |
|
|
|
body |
|
|
|
{ |
|
|
|
codereturn(); |
|
|
|
s_tag($<vWord>3) = LUA_T_FUNCTION; |
|
|
|
s_bvalue($<vWord>3) = calloc (pc, sizeof(Byte)); |
|
|
|
if (s_bvalue($<vWord>3) == NULL) |
|
|
|
lua_error("not enough memory"); |
|
|
|
memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte)); |
|
|
|
funcCode = basepc; maxcode=maxcurr; |
|
|
|
Word func = luaI_findsymbol($2); |
|
|
|
s_tag(func) = LUA_T_FUNCTION; |
|
|
|
s_bvalue(func) = $4; |
|
|
|
#if LISTING |
|
|
|
PrintCode(funcCode,funcCode+pc); |
|
|
|
#endif |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME |
|
|
|
method : FUNCTION NAME ':' NAME |
|
|
|
{ |
|
|
|
init_function(); |
|
|
|
pc=0; basepc=funcCode; maxcurr=maxcode; |
|
|
|
nlocalvar=0; |
|
|
|
localvar[nlocalvar]=lua_findsymbol("self"); /* self param. */ |
|
|
|
init_function($4); |
|
|
|
localvar[nlocalvar]=luaI_findsymbolbyname("self"); |
|
|
|
add_nlocalvar(1); |
|
|
|
$<vWord>$ = lua_findconstant($5); |
|
|
|
} |
|
|
|
'(' parlist ')' |
|
|
|
{ |
|
|
|
if (lua_debug) |
|
|
|
{ |
|
|
|
code_byte(SETFUNCTION); |
|
|
|
code_code((Byte *)strdup(lua_file[lua_nfile-1])); |
|
|
|
code_word($<vWord>6); |
|
|
|
} |
|
|
|
lua_codeadjust (0); |
|
|
|
} |
|
|
|
block |
|
|
|
END |
|
|
|
body |
|
|
|
{ |
|
|
|
Byte *b; |
|
|
|
codereturn(); |
|
|
|
b = calloc (pc, sizeof(Byte)); |
|
|
|
if (b == NULL) |
|
|
|
lua_error("not enough memory"); |
|
|
|
memcpy (b, basepc, pc*sizeof(Byte)); |
|
|
|
funcCode = basepc; maxcode=maxcurr; |
|
|
|
#if LISTING |
|
|
|
PrintCode(funcCode,funcCode+pc); |
|
|
|
#endif |
|
|
|
/* assign function to table field */ |
|
|
|
pc=maincode; basepc=*initcode; maxcurr=maxmain; |
|
|
|
nlocalvar=0; |
|
|
|
|
|
|
|
lua_pushvar($<vWord>3+1); |
|
|
|
lua_pushvar(luaI_findsymbol($2)+1); |
|
|
|
code_byte(PUSHSTRING); |
|
|
|
code_word($<vWord>6); |
|
|
|
code_word(luaI_findconstant($4)); |
|
|
|
code_byte(PUSHFUNCTION); |
|
|
|
code_code(b); |
|
|
|
code_code($6); |
|
|
|
code_byte(STOREINDEXED0); |
|
|
|
|
|
|
|
maincode=pc; *initcode=basepc; maxmain=maxcurr; |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
body : '(' parlist ')' block END |
|
|
|
{ |
|
|
|
codereturn(); |
|
|
|
$$ = calloc (pc, sizeof(Byte)); |
|
|
|
if ($$ == NULL) |
|
|
|
lua_error("not enough memory"); |
|
|
|
memcpy ($$, basepc, pc*sizeof(Byte)); |
|
|
|
funcCode = basepc; maxcode=maxcurr; |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
statlist : /* empty */ |
|
|
|
| statlist stat sc |
|
|
|
; |
|
|
@ -454,7 +416,7 @@ expr : '(' expr ')' { $$ = $2; } |
|
|
|
| STRING |
|
|
|
{ |
|
|
|
code_byte(PUSHSTRING); |
|
|
|
code_word(lua_findconstant($1)); |
|
|
|
code_word($1); |
|
|
|
$$ = 1; |
|
|
|
} |
|
|
|
| NIL {code_byte(PUSHNIL); $$ = 1; } |
|
|
@ -493,7 +455,7 @@ funcvalue : varexp { $$ = 0; } |
|
|
|
| varexp ':' NAME |
|
|
|
{ |
|
|
|
code_byte(PUSHSTRING); |
|
|
|
code_word(lua_findconstant($3)); |
|
|
|
code_word(luaI_findconstant($3)); |
|
|
|
code_byte(PUSHSELF); |
|
|
|
$$ = 1; |
|
|
|
} |
|
|
@ -516,18 +478,18 @@ exprlist1 : expr { if ($1 == 0) $$ = -1; else $$ = 1; } |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
parlist : /* empty */ |
|
|
|
| parlist1 |
|
|
|
parlist : /* empty */ { lua_codeadjust(0); } |
|
|
|
| parlist1 { lua_codeadjust(0); } |
|
|
|
; |
|
|
|
|
|
|
|
parlist1 : NAME |
|
|
|
{ |
|
|
|
localvar[nlocalvar]=lua_findsymbol($1); |
|
|
|
localvar[nlocalvar]=luaI_findsymbol($1); |
|
|
|
add_nlocalvar(1); |
|
|
|
} |
|
|
|
| parlist1 ',' NAME |
|
|
|
{ |
|
|
|
localvar[nlocalvar]=lua_findsymbol($3); |
|
|
|
localvar[nlocalvar]=luaI_findsymbol($3); |
|
|
|
add_nlocalvar(1); |
|
|
|
} |
|
|
|
; |
|
|
@ -555,9 +517,9 @@ ffieldlist1 : ffield {$$=1;} |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
ffield : NAME {$<vWord>$ = lua_findconstant($1);} '=' expr1 |
|
|
|
ffield : NAME '=' expr1 |
|
|
|
{ |
|
|
|
push_field($<vWord>2); |
|
|
|
push_field(luaI_findconstant($1)); |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
@ -591,14 +553,14 @@ var : singlevar { $$ = $1; } |
|
|
|
| varexp '.' NAME |
|
|
|
{ |
|
|
|
code_byte(PUSHSTRING); |
|
|
|
code_word(lua_findconstant($3)); |
|
|
|
code_word(luaI_findconstant($3)); |
|
|
|
$$ = 0; /* indexed variable */ |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
singlevar : NAME |
|
|
|
{ |
|
|
|
Word s = lua_findsymbol($1); |
|
|
|
Word s = luaI_findsymbol($1); |
|
|
|
int local = lua_localname (s); |
|
|
|
if (local == -1) /* global var */ |
|
|
|
$$ = s + 1; /* return positive value */ |
|
|
@ -610,10 +572,10 @@ singlevar : NAME |
|
|
|
varexp : var { lua_pushvar($1); } |
|
|
|
; |
|
|
|
|
|
|
|
localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;} |
|
|
|
localdeclist : NAME {localvar[nlocalvar]=luaI_findsymbol($1); $$ = 1;} |
|
|
|
| localdeclist ',' NAME |
|
|
|
{ |
|
|
|
localvar[nlocalvar+$1]=lua_findsymbol($3); |
|
|
|
localvar[nlocalvar+$1]=luaI_findsymbol($3); |
|
|
|
$$ = $1+1; |
|
|
|
} |
|
|
|
; |
|
|
@ -676,6 +638,25 @@ static void lua_codeadjust (int n) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void init_function (TreeNode *func) |
|
|
|
{ |
|
|
|
if (funcCode == NULL) /* first function */ |
|
|
|
{ |
|
|
|
funcCode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); |
|
|
|
if (funcCode == NULL) |
|
|
|
lua_error("not enough memory"); |
|
|
|
maxcode = CODE_BLOCK; |
|
|
|
} |
|
|
|
pc=0; basepc=funcCode; maxcurr=maxcode; |
|
|
|
nlocalvar=0; |
|
|
|
if (lua_debug) |
|
|
|
{ |
|
|
|
code_byte(SETFUNCTION); |
|
|
|
code_code((Byte *)strdup(lua_file[lua_nfile-1])); |
|
|
|
code_word(luaI_findconstant(func)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void codereturn (void) |
|
|
|
{ |
|
|
|
if (lua_debug) code_byte(RESET); |
|
|
|