From 86b35cf4f6a824880239069d0afe282e95806aaa Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 14 Nov 1994 19:40:14 -0200 Subject: unification of symbol tree and constant tree --- lua.stx | 141 ++++++++++++++++++++++++++++------------------------------------ 1 file changed, 61 insertions(+), 80 deletions(-) (limited to 'lua.stx') diff --git a/lua.stx b/lua.stx index 177e60ed..1b365942 100644 --- a/lua.stx +++ b/lua.stx @@ -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 #include @@ -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 NUMBER -%token STRING -%token NAME +%token STRING +%token NAME %token DEBUG %type PrepJump @@ -208,7 +200,7 @@ static void init_function (void) %type ffieldlist1 %type lfieldlist1 %type var, singlevar - +%type 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; - $$ = lua_findsymbol($2); - } - '(' parlist ')' - { - if (lua_debug) - { - code_byte(SETFUNCTION); - code_code((Byte *)strdup(lua_file[lua_nfile-1])); - code_word($3); - } - lua_codeadjust (0); + init_function($2); } - block - END + body { - codereturn(); - s_tag($3) = LUA_T_FUNCTION; - s_bvalue($3) = calloc (pc, sizeof(Byte)); - if (s_bvalue($3) == NULL) - lua_error("not enough memory"); - memcpy (s_bvalue($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 { $$ = 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); - $$ = lua_findconstant($5); - } - '(' parlist ')' - { - if (lua_debug) - { - code_byte(SETFUNCTION); - code_code((Byte *)strdup(lua_file[lua_nfile-1])); - code_word($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($3+1); + lua_pushvar(luaI_findsymbol($2)+1); code_byte(PUSHSTRING); - code_word($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 {$$ = lua_findconstant($1);} '=' expr1 +ffield : NAME '=' expr1 { - push_field($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); -- cgit v1.2.3-55-g6feb