diff options
Diffstat (limited to '')
| -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 */ |
