aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-15 16:02:04 -0300
committerWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-15 16:02:04 -0300
commitc77d27afa2d66b1d3e979664fdea51f664d9690a (patch)
tree0d051bfdeae9d6f8faa470bcc2b6e9a36f0f9ea6
parentdd704b8fe473eb8c934fe9dd756bda8117beb304 (diff)
downloadlua-c77d27afa2d66b1d3e979664fdea51f664d9690a.tar.gz
lua-c77d27afa2d66b1d3e979664fdea51f664d9690a.tar.bz2
lua-c77d27afa2d66b1d3e979664fdea51f664d9690a.zip
O token NAME deixa de estar associado a um indice da tabela de
simbolos e passa a conter o ponteiro da string yytext. Recebido o token NAME, decide-se entre um simbolo ou uma constante.
-rw-r--r--lua.stx74
1 files changed, 51 insertions, 23 deletions
diff --git a/lua.stx b/lua.stx
index d84b82ac..2b663e06 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 1.5 1994/03/28 15:14:54 celes Exp celes $"; 3char *rcs_luastx = "$Id: lua.stx,v 1.6 1994/04/13 21:37:20 celes Exp celes $";
4 4
5#include <stdio.h> 5#include <stdio.h>
6#include <stdlib.h> 6#include <stdlib.h>
@@ -96,7 +96,7 @@ static void flush_record (int n)
96 code_byte(STORERECORD); 96 code_byte(STORERECORD);
97 code_byte(n); 97 code_byte(n);
98 for (i=0; i<n; i++) 98 for (i=0; i<n; i++)
99 code_word(lua_findconstant(s_name(fields[--nfields]))); 99 code_word(fields[--nfields]);
100 ntemp -= n; 100 ntemp -= n;
101} 101}
102 102
@@ -179,6 +179,7 @@ static void code_number (float f)
179 int vInt; 179 int vInt;
180 long vLong; 180 long vLong;
181 float vFloat; 181 float vFloat;
182 char *pChar;
182 Word vWord; 183 Word vWord;
183 Byte *pByte; 184 Byte *pByte;
184} 185}
@@ -191,7 +192,8 @@ static void code_number (float f)
191%token RETURN 192%token RETURN
192%token LOCAL 193%token LOCAL
193%token <vFloat> NUMBER 194%token <vFloat> NUMBER
194%token <vWord> FUNCTION NAME STRING 195%token <vWord> FUNCTION STRING
196%token <pChar> NAME
195%token <vInt> DEBUG 197%token <vInt> DEBUG
196 198
197%type <pByte> PrepJump 199%type <pByte> PrepJump
@@ -225,13 +227,19 @@ functionlist : /* empty */
225 | functionlist setdebug 227 | functionlist setdebug
226 ; 228 ;
227 229
228function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')' 230function : FUNCTION NAME
231 {
232 $<vWord>$ = lua_findsymbol($2);
233 pc=basepc=code;
234 nlocalvar=0;
235 }
236 '(' parlist ')'
229 { 237 {
230 if (lua_debug) 238 if (lua_debug)
231 { 239 {
232 code_byte(SETFUNCTION); 240 code_byte(SETFUNCTION);
233 code_word(lua_nfile-1); 241 code_word(lua_nfile-1);
234 code_word($2); 242 code_word($<vWord>3);
235 } 243 }
236 lua_codeadjust (0); 244 lua_codeadjust (0);
237 } 245 }
@@ -240,9 +248,9 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')'
240 { 248 {
241 if (lua_debug) code_byte(RESET); 249 if (lua_debug) code_byte(RESET);
242 code_byte(RETCODE); code_byte(nlocalvar); 250 code_byte(RETCODE); code_byte(nlocalvar);
243 s_tag($2) = T_FUNCTION; 251 s_tag($<vWord>3) = T_FUNCTION;
244 s_bvalue($2) = calloc (pc-code, sizeof(Byte)); 252 s_bvalue($<vWord>3) = calloc (pc-code, sizeof(Byte));
245 memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte)); 253 memcpy (s_bvalue($<vWord>3), code, (pc-code)*sizeof(Byte));
246#if LISTING 254#if LISTING
247PrintCode(code,pc,(Byte*)buffer); 255PrintCode(code,pc,(Byte*)buffer);
248#endif 256#endif
@@ -479,20 +487,32 @@ parlist : /* empty */
479 | parlist1 487 | parlist1
480 ; 488 ;
481 489
482parlist1 : NAME {localvar[nlocalvar]=$1; add_nlocalvar(1);} 490parlist1 : NAME
483 | parlist1 ',' NAME {localvar[nlocalvar]=$3; add_nlocalvar(1);} 491 {
492 localvar[nlocalvar]=lua_findsymbol($1);
493 add_nlocalvar(1);
494 }
495 | parlist1 ',' NAME
496 {
497 localvar[nlocalvar]=lua_findsymbol($3);
498 add_nlocalvar(1);
499 }
484 ; 500 ;
485 501
486objectname : /* empty */ {$$=-1;} 502objectname : /* empty */ {$$=-1;}
487 | NAME {$$=$1;} 503 | NAME {$$=lua_findsymbol($1);}
488 ; 504 ;
489 505
490fieldlist : '{' ffieldlist '}' { flush_record($2%FIELDS_PER_FLUSH); $$ = $2; } 506fieldlist : '{' ffieldlist '}'
507 {
508 flush_record($2%FIELDS_PER_FLUSH);
509 $$ = $2;
510 }
491 | '[' lfieldlist ']' 511 | '[' lfieldlist ']'
492 { 512 {
493 flush_list($2/FIELDS_PER_FLUSH, $2%FIELDS_PER_FLUSH); 513 flush_list($2/FIELDS_PER_FLUSH, $2%FIELDS_PER_FLUSH);
494 $$ = $2; 514 $$ = $2;
495 } 515 }
496 ; 516 ;
497 517
498ffieldlist : /* empty */ { $$ = 0; } 518ffieldlist : /* empty */ { $$ = 0; }
@@ -507,7 +527,10 @@ ffieldlist1 : ffield {$$=1;}
507 } 527 }
508 ; 528 ;
509 529
510ffield : NAME '=' expr1 { push_field($1); } 530ffield : NAME {$<vWord>$ = lua_findconstant($1);} '=' expr1
531 {
532 push_field($<vWord>2);
533 }
511 ; 534 ;
512 535
513lfieldlist : /* empty */ { $$ = 0; } 536lfieldlist : /* empty */ { $$ = 0; }
@@ -537,10 +560,11 @@ varlist1 : var
537 ; 560 ;
538 561
539var : NAME 562var : NAME
540 { 563 {
541 int local = lua_localname ($1); 564 Word s = lua_findsymbol($1);
565 int local = lua_localname (s);
542 if (local == -1) /* global var */ 566 if (local == -1) /* global var */
543 $$ = $1 + 1; /* return positive value */ 567 $$ = s + 1; /* return positive value */
544 else 568 else
545 $$ = -(local+1); /* return negative value */ 569 $$ = -(local+1); /* return negative value */
546 } 570 }
@@ -552,13 +576,17 @@ var : NAME
552 | var {lua_pushvar ($1);} '.' NAME 576 | var {lua_pushvar ($1);} '.' NAME
553 { 577 {
554 code_byte(PUSHSTRING); 578 code_byte(PUSHSTRING);
555 code_word(lua_findconstant (s_name($4))); incr_ntemp(); 579 code_word(lua_findconstant($4)); incr_ntemp();
556 $$ = 0; /* indexed variable */ 580 $$ = 0; /* indexed variable */
557 } 581 }
558 ; 582 ;
559 583
560localdeclist : NAME {localvar[nlocalvar]=$1; $$ = 1;} 584localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;}
561 | localdeclist ',' NAME {localvar[nlocalvar+$1]=$3; $$ = $1+1;} 585 | localdeclist ',' NAME
586 {
587 localvar[nlocalvar+$1]=lua_findsymbol($3);
588 $$ = $1+1;
589 }
562 ; 590 ;
563 591
564decinit : /* empty */ 592decinit : /* empty */