diff options
| author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-08-05 16:31:09 -0300 |
|---|---|---|
| committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-08-05 16:31:09 -0300 |
| commit | 41fd23287aae60354c264be8f1807bccd937fbf1 (patch) | |
| tree | 58670393eeb575ee622ca52dbde7b65f7ce3098f /lua.stx | |
| parent | be7aa3854be4c8d9203637955a064439f240951f (diff) | |
| download | lua-41fd23287aae60354c264be8f1807bccd937fbf1.tar.gz lua-41fd23287aae60354c264be8f1807bccd937fbf1.tar.bz2 lua-41fd23287aae60354c264be8f1807bccd937fbf1.zip | |
Implementacao da definicao e chamada de METODOS.
Diffstat (limited to 'lua.stx')
| -rw-r--r-- | lua.stx | 155 |
1 files changed, 125 insertions, 30 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | 2 | ||
| 3 | char *rcs_luastx = "$Id: lua.stx,v 2.5 1994/07/19 21:27:18 celes Exp $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 2.6 1994/08/03 14:15:46 celes Exp celes $"; |
| 4 | 4 | ||
| 5 | #include <stdio.h> | 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
| @@ -77,6 +77,16 @@ static void code_float (float n) | |||
| 77 | code_byte(code.m.c4); | 77 | code_byte(code.m.c4); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | static void code_code (Byte *b) | ||
| 81 | { | ||
| 82 | CodeCode code; | ||
| 83 | code.b = b; | ||
| 84 | code_byte(code.m.c1); | ||
| 85 | code_byte(code.m.c2); | ||
| 86 | code_byte(code.m.c3); | ||
| 87 | code_byte(code.m.c4); | ||
| 88 | } | ||
| 89 | |||
| 80 | static void code_word_at (Byte *p, Word n) | 90 | static void code_word_at (Byte *p, Word n) |
| 81 | { | 91 | { |
| 82 | CodeWord code; | 92 | CodeWord code; |
| @@ -185,6 +195,21 @@ static void code_number (float f) | |||
| 185 | incr_ntemp(); | 195 | incr_ntemp(); |
| 186 | } | 196 | } |
| 187 | 197 | ||
| 198 | static void init_function (void) | ||
| 199 | { | ||
| 200 | if (code == NULL) /* first function */ | ||
| 201 | { | ||
| 202 | code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); | ||
| 203 | if (code == NULL) | ||
| 204 | { | ||
| 205 | lua_error("not enough memory"); | ||
| 206 | err = 1; | ||
| 207 | } | ||
| 208 | maxcode = CODE_BLOCK; | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 212 | |||
| 188 | %} | 213 | %} |
| 189 | 214 | ||
| 190 | 215 | ||
| @@ -205,9 +230,10 @@ static void code_number (float f) | |||
| 205 | %token IF THEN ELSE ELSEIF WHILE DO REPEAT UNTIL END | 230 | %token IF THEN ELSE ELSEIF WHILE DO REPEAT UNTIL END |
| 206 | %token RETURN | 231 | %token RETURN |
| 207 | %token LOCAL | 232 | %token LOCAL |
| 233 | %token FUNCTION | ||
| 208 | %token <vFloat> NUMBER | 234 | %token <vFloat> NUMBER |
| 209 | %token <vWord> FUNCTION STRING | 235 | %token <vWord> STRING |
| 210 | %token <pChar> NAME | 236 | %token <pChar> NAME |
| 211 | %token <vInt> DEBUG | 237 | %token <vInt> DEBUG |
| 212 | 238 | ||
| 213 | %type <vLong> PrepJump | 239 | %type <vLong> PrepJump |
| @@ -215,7 +241,8 @@ static void code_number (float f) | |||
| 215 | %type <vInt> fieldlist, localdeclist | 241 | %type <vInt> fieldlist, localdeclist |
| 216 | %type <vInt> ffieldlist, ffieldlist1 | 242 | %type <vInt> ffieldlist, ffieldlist1 |
| 217 | %type <vInt> lfieldlist, lfieldlist1 | 243 | %type <vInt> lfieldlist, lfieldlist1 |
| 218 | %type <vLong> var, objectname | 244 | %type <vInt> functionvalue |
| 245 | %type <vLong> var, singlevar, objectname | ||
| 219 | 246 | ||
| 220 | 247 | ||
| 221 | %left AND OR | 248 | %left AND OR |
| @@ -240,21 +267,13 @@ functionlist : /* empty */ | |||
| 240 | maincode=pc; initcode=basepc; maxmain=maxcurr; | 267 | maincode=pc; initcode=basepc; maxmain=maxcurr; |
| 241 | } | 268 | } |
| 242 | | functionlist function | 269 | | functionlist function |
| 270 | | functionlist method | ||
| 243 | | functionlist setdebug | 271 | | functionlist setdebug |
| 244 | ; | 272 | ; |
| 245 | 273 | ||
| 246 | function : FUNCTION NAME | 274 | function : FUNCTION NAME |
| 247 | { | 275 | { |
| 248 | if (code == NULL) /* first function */ | 276 | init_function(); |
| 249 | { | ||
| 250 | code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); | ||
| 251 | if (code == NULL) | ||
| 252 | { | ||
| 253 | lua_error("not enough memory"); | ||
| 254 | err = 1; | ||
| 255 | } | ||
| 256 | maxcode = CODE_BLOCK; | ||
| 257 | } | ||
| 258 | pc=0; basepc=code; maxcurr=maxcode; | 277 | pc=0; basepc=code; maxcurr=maxcode; |
| 259 | nlocalvar=0; | 278 | nlocalvar=0; |
| 260 | $<vWord>$ = lua_findsymbol($2); | 279 | $<vWord>$ = lua_findsymbol($2); |
| @@ -284,11 +303,62 @@ function : FUNCTION NAME | |||
| 284 | memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte)); | 303 | memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte)); |
| 285 | code = basepc; maxcode=maxcurr; | 304 | code = basepc; maxcode=maxcurr; |
| 286 | #if LISTING | 305 | #if LISTING |
| 287 | PrintCode(code,code+pc); | 306 | PrintCode(code,code+pc); |
| 288 | #endif | 307 | #endif |
| 289 | } | 308 | } |
| 290 | ; | 309 | ; |
| 291 | 310 | ||
| 311 | method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME | ||
| 312 | { | ||
| 313 | init_function(); | ||
| 314 | pc=0; basepc=code; maxcurr=maxcode; | ||
| 315 | nlocalvar=0; | ||
| 316 | localvar[nlocalvar]=lua_findsymbol("self"); /* self param. */ | ||
| 317 | add_nlocalvar(1); | ||
| 318 | $<vWord>$ = lua_findconstant($5); | ||
| 319 | } | ||
| 320 | '(' parlist ')' | ||
| 321 | { | ||
| 322 | if (lua_debug) | ||
| 323 | { | ||
| 324 | code_byte(SETFUNCTION); | ||
| 325 | code_word(lua_nfile-1); | ||
| 326 | code_word($<vWord>6); | ||
| 327 | } | ||
| 328 | lua_codeadjust (0); | ||
| 329 | } | ||
| 330 | block | ||
| 331 | END | ||
| 332 | { | ||
| 333 | Byte *b; | ||
| 334 | if (lua_debug) code_byte(RESET); | ||
| 335 | code_byte(RETCODE); code_byte(nlocalvar); | ||
| 336 | b = calloc (pc, sizeof(Byte)); | ||
| 337 | if (b == NULL) | ||
| 338 | { | ||
| 339 | lua_error("not enough memory"); | ||
| 340 | err = 1; | ||
| 341 | } | ||
| 342 | memcpy (b, basepc, pc*sizeof(Byte)); | ||
| 343 | code = basepc; maxcode=maxcurr; | ||
| 344 | #if LISTING | ||
| 345 | PrintCode(code,code+pc); | ||
| 346 | #endif | ||
| 347 | /* assign function to table field */ | ||
| 348 | pc=maincode; basepc=initcode; maxcurr=maxmain; | ||
| 349 | nlocalvar=0; | ||
| 350 | |||
| 351 | lua_pushvar($<vWord>3+1); | ||
| 352 | code_byte(PUSHSTRING); | ||
| 353 | code_word($<vWord>6); | ||
| 354 | code_byte(PUSHFUNCTION); | ||
| 355 | code_code(b); | ||
| 356 | code_byte(STOREINDEXED0); | ||
| 357 | |||
| 358 | maincode=pc; initcode=basepc; maxmain=maxcurr; | ||
| 359 | } | ||
| 360 | ; | ||
| 361 | |||
| 292 | statlist : /* empty */ | 362 | statlist : /* empty */ |
| 293 | | statlist stat sc | 363 | | statlist stat sc |
| 294 | ; | 364 | ; |
| @@ -499,10 +569,23 @@ dimension : /* empty */ { code_byte(PUSHNIL); incr_ntemp();} | |||
| 499 | | expr1 | 569 | | expr1 |
| 500 | ; | 570 | ; |
| 501 | 571 | ||
| 502 | functioncall : functionvalue {code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp();} | 572 | functioncall : functionvalue |
| 503 | '(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;} | 573 | { |
| 574 | code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp(); | ||
| 575 | if ($1 != 0) lua_pushvar($1); | ||
| 576 | } | ||
| 577 | '(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;} | ||
| 504 | 578 | ||
| 505 | functionvalue : var {lua_pushvar ($1); } | 579 | functionvalue : var {lua_pushvar ($1); $$ = 0; } |
| 580 | | singlevar ':' NAME | ||
| 581 | { | ||
| 582 | $$ = $1; | ||
| 583 | lua_pushvar($1); | ||
| 584 | code_byte(PUSHSTRING); | ||
| 585 | code_word(lua_findconstant($3)); | ||
| 586 | incr_ntemp(); | ||
| 587 | lua_pushvar(0); | ||
| 588 | } | ||
| 506 | ; | 589 | ; |
| 507 | 590 | ||
| 508 | exprlist : /* empty */ { $$ = 1; } | 591 | exprlist : /* empty */ { $$ = 1; } |
| @@ -590,16 +673,7 @@ varlist1 : var | |||
| 590 | } | 673 | } |
| 591 | ; | 674 | ; |
| 592 | 675 | ||
| 593 | var : NAME | 676 | var : singlevar { $$ = $1; } |
| 594 | { | ||
| 595 | Word s = lua_findsymbol($1); | ||
| 596 | int local = lua_localname (s); | ||
| 597 | if (local == -1) /* global var */ | ||
| 598 | $$ = s + 1; /* return positive value */ | ||
| 599 | else | ||
| 600 | $$ = -(local+1); /* return negative value */ | ||
| 601 | } | ||
| 602 | |||
| 603 | | var {lua_pushvar ($1);} '[' expr1 ']' | 677 | | var {lua_pushvar ($1);} '[' expr1 ']' |
| 604 | { | 678 | { |
| 605 | $$ = 0; /* indexed variable */ | 679 | $$ = 0; /* indexed variable */ |
| @@ -612,6 +686,17 @@ var : NAME | |||
| 612 | } | 686 | } |
| 613 | ; | 687 | ; |
| 614 | 688 | ||
| 689 | singlevar : NAME | ||
| 690 | { | ||
| 691 | Word s = lua_findsymbol($1); | ||
| 692 | int local = lua_localname (s); | ||
| 693 | if (local == -1) /* global var */ | ||
| 694 | $$ = s + 1; /* return positive value */ | ||
| 695 | else | ||
| 696 | $$ = -(local+1); /* return negative value */ | ||
| 697 | } | ||
| 698 | ; | ||
| 699 | |||
| 615 | localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;} | 700 | localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;} |
| 616 | | localdeclist ',' NAME | 701 | | localdeclist ',' NAME |
| 617 | { | 702 | { |
| @@ -799,6 +884,16 @@ static void PrintCode (Byte *code, Byte *end) | |||
| 799 | printf ("%d PUSHSTRING %d\n", n, c.w); | 884 | printf ("%d PUSHSTRING %d\n", n, c.w); |
| 800 | } | 885 | } |
| 801 | break; | 886 | break; |
| 887 | case PUSHFUNCTION: | ||
| 888 | { | ||
| 889 | CodeCode c; | ||
| 890 | int n = p-code; | ||
| 891 | p++; | ||
| 892 | get_code(c,p); | ||
| 893 | printf ("%d PUSHFUNCTION %p\n", n, c.b); | ||
| 894 | } | ||
| 895 | break; | ||
| 896 | |||
| 802 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: | 897 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: |
| 803 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: | 898 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: |
| 804 | case PUSHLOCAL8: case PUSHLOCAL9: | 899 | case PUSHLOCAL8: case PUSHLOCAL9: |
