aboutsummaryrefslogtreecommitdiff
path: root/lua.stx
diff options
context:
space:
mode:
Diffstat (limited to 'lua.stx')
-rw-r--r--lua.stx104
1 files changed, 42 insertions, 62 deletions
diff --git a/lua.stx b/lua.stx
index 199c464a..79224d3d 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 2.6 1994/08/03 14:15:46 celes Exp celes $"; 3char *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
483expr : '(' expr ')' { $$ = $2; } 483expr : '(' 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
536typeconstructor: '@' 532constructor : '@' 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 ;
547table :
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
568dimension : /* empty */ { code_byte(PUSHNIL); incr_ntemp();}
569 | expr1
570 ;
571
572functioncall : functionvalue 560functioncall : 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
579functionvalue : var {lua_pushvar ($1); $$ = 0; } 568functionvalue : var {lua_pushvar ($1); $$ = 0; }
580 | singlevar ':' NAME 569 | singlevar ':' NAME
@@ -613,25 +602,20 @@ parlist1 : NAME
613 } 602 }
614 ; 603 ;
615 604
616objectname : /* empty */ {$$=-1;} 605fieldlist : /* 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
620fieldlist : '{' 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
632ffieldlist : /* empty */ { $$ = 0; } 616lastcomma : /* empty */
633 | ffieldlist1 { $$ = $1; } 617 | ','
634 ; 618 ;
635 619
636ffieldlist1 : ffield {$$=1;} 620ffieldlist1 : 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
650lfieldlist : /* empty */ { $$ = 0; }
651 | lfieldlist1 { $$ = $1; }
652 ;
653
654lfieldlist1 : expr1 {$$=1;} 634lfieldlist1 : expr1 {$$=1;}
655 | lfieldlist1 ',' expr1 635 | lfieldlist1 ',' expr1
656 { 636 {