diff options
Diffstat (limited to 'lua.stx')
-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 | { |