diff options
author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-04-15 16:02:04 -0300 |
---|---|---|
committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-04-15 16:02:04 -0300 |
commit | c77d27afa2d66b1d3e979664fdea51f664d9690a (patch) | |
tree | 0d051bfdeae9d6f8faa470bcc2b6e9a36f0f9ea6 | |
parent | dd704b8fe473eb8c934fe9dd756bda8117beb304 (diff) | |
download | lua-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.stx | 74 |
1 files changed, 51 insertions, 23 deletions
@@ -1,6 +1,6 @@ | |||
1 | %{ | 1 | %{ |
2 | 2 | ||
3 | char *rcs_luastx = "$Id: lua.stx,v 1.5 1994/03/28 15:14:54 celes Exp celes $"; | 3 | char *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 | ||
228 | function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')' | 230 | function : 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 |
247 | PrintCode(code,pc,(Byte*)buffer); | 255 | PrintCode(code,pc,(Byte*)buffer); |
248 | #endif | 256 | #endif |
@@ -479,20 +487,32 @@ parlist : /* empty */ | |||
479 | | parlist1 | 487 | | parlist1 |
480 | ; | 488 | ; |
481 | 489 | ||
482 | parlist1 : NAME {localvar[nlocalvar]=$1; add_nlocalvar(1);} | 490 | parlist1 : 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 | ||
486 | objectname : /* empty */ {$$=-1;} | 502 | objectname : /* empty */ {$$=-1;} |
487 | | NAME {$$=$1;} | 503 | | NAME {$$=lua_findsymbol($1);} |
488 | ; | 504 | ; |
489 | 505 | ||
490 | fieldlist : '{' ffieldlist '}' { flush_record($2%FIELDS_PER_FLUSH); $$ = $2; } | 506 | fieldlist : '{' 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 | ||
498 | ffieldlist : /* empty */ { $$ = 0; } | 518 | ffieldlist : /* empty */ { $$ = 0; } |
@@ -507,7 +527,10 @@ ffieldlist1 : ffield {$$=1;} | |||
507 | } | 527 | } |
508 | ; | 528 | ; |
509 | 529 | ||
510 | ffield : NAME '=' expr1 { push_field($1); } | 530 | ffield : NAME {$<vWord>$ = lua_findconstant($1);} '=' expr1 |
531 | { | ||
532 | push_field($<vWord>2); | ||
533 | } | ||
511 | ; | 534 | ; |
512 | 535 | ||
513 | lfieldlist : /* empty */ { $$ = 0; } | 536 | lfieldlist : /* empty */ { $$ = 0; } |
@@ -537,10 +560,11 @@ varlist1 : var | |||
537 | ; | 560 | ; |
538 | 561 | ||
539 | var : NAME | 562 | var : 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 | ||
560 | localdeclist : NAME {localvar[nlocalvar]=$1; $$ = 1;} | 584 | localdeclist : 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 | ||
564 | decinit : /* empty */ | 592 | decinit : /* empty */ |