diff options
Diffstat (limited to '')
| -rw-r--r-- | lua.stx | 104 |
1 files changed, 42 insertions, 62 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | 2 | ||
| 3 | char *rcs_luastx = "$Id: lua.stx,v 2.6 1994/08/03 14:15:46 celes Exp celes $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 2.7 1994/08/05 19:31:09 celes Exp celes $"; |
| 4 | 4 | ||
| 5 | #include <stdio.h> | 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
| @@ -232,21 +232,21 @@ static void init_function (void) | |||
| 232 | %token LOCAL | 232 | %token LOCAL |
| 233 | %token FUNCTION | 233 | %token FUNCTION |
| 234 | %token <vFloat> NUMBER | 234 | %token <vFloat> NUMBER |
| 235 | %token <vWord> STRING | 235 | %token <pChar> STRING |
| 236 | %token <pChar> NAME | 236 | %token <pChar> NAME |
| 237 | %token <vInt> DEBUG | 237 | %token <vInt> DEBUG |
| 238 | 238 | ||
| 239 | %type <vLong> PrepJump | 239 | %type <vLong> PrepJump |
| 240 | %type <vInt> expr, exprlist, exprlist1, varlist1, typeconstructor | 240 | %type <vInt> expr, exprlist, exprlist1, varlist1 |
| 241 | %type <vInt> fieldlist, localdeclist | 241 | %type <vInt> fieldlist, localdeclist |
| 242 | %type <vInt> ffieldlist, ffieldlist1 | 242 | %type <vInt> ffieldlist1 |
| 243 | %type <vInt> lfieldlist, lfieldlist1 | 243 | %type <vInt> lfieldlist1 |
| 244 | %type <vInt> functionvalue | 244 | %type <vInt> functionvalue |
| 245 | %type <vLong> var, singlevar, objectname | 245 | %type <vLong> var, singlevar |
| 246 | 246 | ||
| 247 | 247 | ||
| 248 | %left AND OR | 248 | %left AND OR |
| 249 | %left '=' NE '>' '<' LE GE | 249 | %left EQ NE '>' '<' LE GE |
| 250 | %left CONC | 250 | %left CONC |
| 251 | %left '+' '-' | 251 | %left '+' '-' |
| 252 | %left '*' '/' | 252 | %left '*' '/' |
| @@ -425,7 +425,7 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END | |||
| 425 | } | 425 | } |
| 426 | } | 426 | } |
| 427 | | functioncall { lua_codeadjust (0); } | 427 | | functioncall { lua_codeadjust (0); } |
| 428 | | typeconstructor { lua_codeadjust (0); } | 428 | | constructor { lua_codeadjust (0); } |
| 429 | | LOCAL localdeclist decinit { add_nlocalvar($2); lua_codeadjust (0); } | 429 | | LOCAL localdeclist decinit { add_nlocalvar($2); lua_codeadjust (0); } |
| 430 | ; | 430 | ; |
| 431 | 431 | ||
| @@ -481,7 +481,7 @@ expr1 : expr { if ($1 == 0) {lua_codeadjust (ntemp+1); incr_ntemp();}} | |||
| 481 | ; | 481 | ; |
| 482 | 482 | ||
| 483 | expr : '(' expr ')' { $$ = $2; } | 483 | expr : '(' expr ')' { $$ = $2; } |
| 484 | | expr1 '=' expr1 { code_byte(EQOP); $$ = 1; ntemp--;} | 484 | | expr1 EQ expr1 { code_byte(EQOP); $$ = 1; ntemp--;} |
| 485 | | expr1 '<' expr1 { code_byte(LTOP); $$ = 1; ntemp--;} | 485 | | expr1 '<' expr1 { code_byte(LTOP); $$ = 1; ntemp--;} |
| 486 | | expr1 '>' expr1 { code_byte(LEOP); code_byte(NOTOP); $$ = 1; ntemp--;} | 486 | | expr1 '>' expr1 { code_byte(LEOP); code_byte(NOTOP); $$ = 1; ntemp--;} |
| 487 | | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 1; ntemp--;} | 487 | | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 1; ntemp--;} |
| @@ -494,18 +494,14 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 494 | | expr1 CONC expr1 { code_byte(CONCOP); $$ = 1; ntemp--;} | 494 | | expr1 CONC expr1 { code_byte(CONCOP); $$ = 1; ntemp--;} |
| 495 | | '+' expr1 %prec UNARY { $$ = 1; } | 495 | | '+' expr1 %prec UNARY { $$ = 1; } |
| 496 | | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 1;} | 496 | | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 1;} |
| 497 | | typeconstructor { $$ = $1; } | 497 | | constructor { $$ = 0; } |
| 498 | | '@' '(' dimension ')' | 498 | | table { $$ = 1; } |
| 499 | { | ||
| 500 | code_byte(CREATEARRAY); | ||
| 501 | $$ = 1; | ||
| 502 | } | ||
| 503 | | var { lua_pushvar ($1); $$ = 1;} | 499 | | var { lua_pushvar ($1); $$ = 1;} |
| 504 | | NUMBER { code_number($1); $$ = 1; } | 500 | | NUMBER { code_number($1); $$ = 1; } |
| 505 | | STRING | 501 | | STRING |
| 506 | { | 502 | { |
| 507 | code_byte(PUSHSTRING); | 503 | code_byte(PUSHSTRING); |
| 508 | code_word($1); | 504 | code_word(lua_findconstant($1)); |
| 509 | $$ = 1; | 505 | $$ = 1; |
| 510 | incr_ntemp(); | 506 | incr_ntemp(); |
| 511 | } | 507 | } |
| @@ -533,48 +529,41 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 533 | } | 529 | } |
| 534 | ; | 530 | ; |
| 535 | 531 | ||
| 536 | typeconstructor: '@' | 532 | constructor : '@' singlevar table |
| 537 | { | ||
| 538 | code_byte(PUSHWORD); | ||
| 539 | $<vLong>$ = pc; code_word(0); | ||
| 540 | incr_ntemp(); | ||
| 541 | code_byte(CREATEARRAY); | ||
| 542 | } | ||
| 543 | objectname fieldlist | ||
| 544 | { | ||
| 545 | code_word_at(basepc+$<vLong>2, $4); | ||
| 546 | if ($3 < 0) /* there is no function to be called */ | ||
| 547 | { | ||
| 548 | $$ = 1; | ||
| 549 | } | ||
| 550 | else | ||
| 551 | { | 533 | { |
| 552 | lua_pushvar ($3+1); | 534 | lua_pushvar ($2); |
| 553 | code_byte(PUSHMARK); | 535 | code_byte(PUSHMARK); |
| 554 | incr_ntemp(); | 536 | incr_ntemp(); |
| 555 | code_byte(PUSHOBJECT); | 537 | code_byte(PUSHOBJECT); |
| 556 | incr_ntemp(); | 538 | incr_ntemp(); |
| 557 | code_byte(CALLFUNC); | 539 | code_byte(CALLFUNC); |
| 558 | ntemp -= 4; | 540 | ntemp -= 4; |
| 559 | $$ = 0; | ||
| 560 | if (lua_debug) | 541 | if (lua_debug) |
| 561 | { | 542 | { |
| 562 | code_byte(SETLINE); code_word(lua_linenumber); | 543 | code_byte(SETLINE); code_word(lua_linenumber); |
| 563 | } | 544 | } |
| 564 | } | 545 | } |
| 546 | ; | ||
| 547 | table : | ||
| 548 | { | ||
| 549 | code_byte(PUSHWORD); | ||
| 550 | $<vLong>$ = pc; code_word(0); | ||
| 551 | incr_ntemp(); | ||
| 552 | code_byte(CREATEARRAY); | ||
| 553 | } | ||
| 554 | '{' fieldlist '}' | ||
| 555 | { | ||
| 556 | code_word_at(basepc+$<vLong>1, $3); | ||
| 565 | } | 557 | } |
| 566 | ; | 558 | ; |
| 567 | 559 | ||
| 568 | dimension : /* empty */ { code_byte(PUSHNIL); incr_ntemp();} | ||
| 569 | | expr1 | ||
| 570 | ; | ||
| 571 | |||
| 572 | functioncall : functionvalue | 560 | functioncall : functionvalue |
| 573 | { | 561 | { |
| 574 | code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp(); | 562 | code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp(); |
| 575 | if ($1 != 0) lua_pushvar($1); | 563 | if ($1 != 0) lua_pushvar($1); |
| 576 | } | 564 | } |
| 577 | '(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;} | 565 | '(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;} |
| 566 | ; | ||
| 578 | 567 | ||
| 579 | functionvalue : var {lua_pushvar ($1); $$ = 0; } | 568 | functionvalue : var {lua_pushvar ($1); $$ = 0; } |
| 580 | | singlevar ':' NAME | 569 | | singlevar ':' NAME |
| @@ -613,25 +602,20 @@ parlist1 : NAME | |||
| 613 | } | 602 | } |
| 614 | ; | 603 | ; |
| 615 | 604 | ||
| 616 | objectname : /* empty */ {$$=-1;} | 605 | fieldlist : /* empty */ { $$ = 0; } |
| 617 | | NAME {$$=lua_findsymbol($1);} | 606 | | lfieldlist1 lastcomma |
| 618 | ; | 607 | { $$ = $1; flush_list($1/FIELDS_PER_FLUSH, $1%FIELDS_PER_FLUSH); } |
| 619 | 608 | | ffieldlist1 lastcomma | |
| 620 | fieldlist : '{' ffieldlist '}' | 609 | { $$ = $1; flush_record($1%FIELDS_PER_FLUSH); } |
| 621 | { | 610 | | lfieldlist1 ';' |
| 622 | flush_record($2%FIELDS_PER_FLUSH); | 611 | { flush_list($1/FIELDS_PER_FLUSH, $1%FIELDS_PER_FLUSH); } |
| 623 | $$ = $2; | 612 | ffieldlist1 lastcomma |
| 624 | } | 613 | { $$ = $1+$4; flush_record($4%FIELDS_PER_FLUSH); } |
| 625 | | '[' lfieldlist ']' | ||
| 626 | { | ||
| 627 | flush_list($2/FIELDS_PER_FLUSH, $2%FIELDS_PER_FLUSH); | ||
| 628 | $$ = $2; | ||
| 629 | } | ||
| 630 | ; | 614 | ; |
| 631 | 615 | ||
| 632 | ffieldlist : /* empty */ { $$ = 0; } | 616 | lastcomma : /* empty */ |
| 633 | | ffieldlist1 { $$ = $1; } | 617 | | ',' |
| 634 | ; | 618 | ; |
| 635 | 619 | ||
| 636 | ffieldlist1 : ffield {$$=1;} | 620 | ffieldlist1 : ffield {$$=1;} |
| 637 | | ffieldlist1 ',' ffield | 621 | | ffieldlist1 ',' ffield |
| @@ -647,10 +631,6 @@ ffield : NAME {$<vWord>$ = lua_findconstant($1);} '=' expr1 | |||
| 647 | } | 631 | } |
| 648 | ; | 632 | ; |
| 649 | 633 | ||
| 650 | lfieldlist : /* empty */ { $$ = 0; } | ||
| 651 | | lfieldlist1 { $$ = $1; } | ||
| 652 | ; | ||
| 653 | |||
| 654 | lfieldlist1 : expr1 {$$=1;} | 634 | lfieldlist1 : expr1 {$$=1;} |
| 655 | | lfieldlist1 ',' expr1 | 635 | | lfieldlist1 ',' expr1 |
| 656 | { | 636 | { |
