aboutsummaryrefslogtreecommitdiff
path: root/lua.stx
diff options
context:
space:
mode:
Diffstat (limited to 'lua.stx')
-rw-r--r--lua.stx87
1 files changed, 27 insertions, 60 deletions
diff --git a/lua.stx b/lua.stx
index fb85d18f..112a6b40 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2/* 2/*
3** $Id: lua.stx,v 1.8 1997/10/06 14:51:11 roberto Exp roberto $ 3** $Id: lua.stx,v 1.9 1997/10/13 22:12:04 roberto Exp roberto $
4** Syntax analizer and code generator 4** Syntax analizer and code generator
5** See Copyright Notice in lua.h 5** See Copyright Notice in lua.h
6*/ 6*/
@@ -422,8 +422,9 @@ static void adjust_mult_assign (int vars, long exps)
422} 422}
423 423
424 424
425static void code_args (int dots) 425static void code_args (int nparams, int dots)
426{ 426{
427 currState->nlocalvar += nparams;
427 if (!dots) 428 if (!dots)
428 code_oparg(ARGS, 0, currState->nlocalvar, currState->nlocalvar); 429 code_oparg(ARGS, 0, currState->nlocalvar, currState->nlocalvar);
429 else { 430 else {
@@ -617,11 +618,10 @@ TProtoFunc *luaY_parser (ZIO *z, char *chunkname)
617%type <vLong> functioncall, expr /* if != 0, points to function return 618%type <vLong> functioncall, expr /* if != 0, points to function return
618 counter */ 619 counter */
619%type <vInt> varlist1, funcParams, funcvalue 620%type <vInt> varlist1, funcParams, funcvalue
620%type <vInt> fieldlist, localdeclist, decinit 621%type <vInt> fieldlist, localnamelist, decinit
621%type <vInt> ffieldlist, ffieldlist1, semicolonpart 622%type <vInt> ffieldlist, ffieldlist1, semicolonpart
622%type <vInt> lfieldlist, lfieldlist1 623%type <vInt> lfieldlist, lfieldlist1
623%type <vInt> parlist1, par 624%type <vLong> var, funcname /* vardesc */
624%type <vLong> var, singlevar, funcname /* vardesc */
625%type <pFunc> body 625%type <pFunc> body
626 626
627 627
@@ -646,8 +646,7 @@ statlist : /* empty */
646 646
647sc : /* empty */ | ';' ; 647sc : /* empty */ | ';' ;
648 648
649stat : IF cond THEN block SaveWord elsepart END 649stat : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); }
650 { codeIf($2, $5); }
651 650
652 | WHILE GetPC cond DO block END 651 | WHILE GetPC cond DO block END
653 {{ 652 {{
@@ -676,17 +675,16 @@ stat : IF cond THEN block SaveWord elsepart END
676 left = lua_codestore(i, left); 675 left = lua_codestore(i, left);
677 adjuststack(left); /* remove eventual 'garbage' left on stack */ 676 adjuststack(left); /* remove eventual 'garbage' left on stack */
678 }} 677 }}
678
679 | functioncall { adjust_functioncall($1, 0); } 679 | functioncall { adjust_functioncall($1, 0); }
680 | LOCAL localdeclist decinit 680
681 | LOCAL localnamelist decinit
681 { 682 {
682 currState->nlocalvar += $2; 683 currState->nlocalvar += $2;
683 adjust_mult_assign($2, $3); 684 adjust_mult_assign($2, $3);
684 } 685 }
685 | FUNCTION funcname body 686
686 { 687 | FUNCTION funcname body { func_onstack($3); storevar($2); }
687 func_onstack($3);
688 storevar($2);
689 }
690 ; 688 ;
691 689
692block : {$<vInt>$ = currState->nlocalvar;} chunk 690block : {$<vInt>$ = currState->nlocalvar;} chunk
@@ -701,7 +699,7 @@ funcname : var { init_func(); $$ = $1; }
701 | varexp ':' NAME 699 | varexp ':' NAME
702 { 700 {
703 code_string($3); 701 code_string($3);
704 $$ = 0; /* indexed variable */ 702 $$ = 0; /* flag indexed variable */
705 init_func(); 703 init_func();
706 add_localvar(luaS_new("self")); 704 add_localvar(luaS_new("self"));
707 } 705 }
@@ -712,8 +710,7 @@ body : '(' parlist ')' chunk END { $$ = close_func(); }
712 710
713elsepart : /* empty */ 711elsepart : /* empty */
714 | ELSE block 712 | ELSE block
715 | ELSEIF cond THEN block SaveWord elsepart 713 | ELSEIF cond THEN block SaveWord elsepart { codeIf($2, $5); }
716 { codeIf($2, $5); }
717 ; 714 ;
718 715
719ret : /* empty */ 716ret : /* empty */
@@ -792,8 +789,7 @@ funcvalue : varexp { $$ = 0; }
792 } 789 }
793 ; 790 ;
794 791
795funcParams : '(' exprlist ')' 792funcParams : '(' exprlist ')' { $$ = adjust_functioncall($2, 1); }
796 { $$ = adjust_functioncall($2, 1); }
797 | table { $$ = 1; } 793 | table { $$ = 1; }
798 ; 794 ;
799 795
@@ -805,30 +801,18 @@ exprlist1 : expr { if ($1 != 0) $$ = $1; else $$ = -1; }
805 | exprlist1 ',' { $<vLong>$ = adjust_functioncall($1, 1); } expr 801 | exprlist1 ',' { $<vLong>$ = adjust_functioncall($1, 1); } expr
806 { 802 {
807 if ($4 == 0) $$ = -($<vLong>3 + 1); /* -length */ 803 if ($4 == 0) $$ = -($<vLong>3 + 1); /* -length */
808 else 804 else {
809 {
810 currState->f->code[$4] = $<vLong>3; /* store list length */ 805 currState->f->code[$4] = $<vLong>3; /* store list length */
811 $$ = $4; 806 $$ = $4;
812 } 807 }
813 } 808 }
814 ; 809 ;
815 810
816parlist : /* empty */ { code_args(0); } 811parlist : /* empty */ { code_args(0, 0); }
817 | parlist1 { code_args($1); } 812 | DOTS { code_args(0, 1); }
818 ; 813 | localnamelist { code_args($1, 0); }
819 814 | localnamelist ',' DOTS { code_args($1, 1); }
820parlist1 : par { $$ = $1; }
821 | parlist1 ',' par
822 {
823 if ($1)
824 luaY_error("invalid parameter list");
825 $$ = $3;
826 }
827 ; 815 ;
828
829par : NAME { add_localvar($1); $$ = 0; }
830 | DOTS { $$ = 1; }
831 ;
832 816
833fieldlist : lfieldlist 817fieldlist : lfieldlist
834 { flush_list($1/LFIELDS_PER_FLUSH, $1%LFIELDS_PER_FLUSH); } 818 { flush_list($1/LFIELDS_PER_FLUSH, $1%LFIELDS_PER_FLUSH); }
@@ -838,10 +822,8 @@ fieldlist : lfieldlist
838 { $$ = $1; flush_record($1%RFIELDS_PER_FLUSH); } 822 { $$ = $1; flush_record($1%RFIELDS_PER_FLUSH); }
839 ; 823 ;
840 824
841semicolonpart : /* empty */ 825semicolonpart : /* empty */ { $$ = 0; }
842 { $$ = 0; } 826 | ';' ffieldlist { $$ = $2; flush_record($2%RFIELDS_PER_FLUSH); }
843 | ';' ffieldlist
844 { $$ = $2; flush_record($2%RFIELDS_PER_FLUSH); }
845 ; 827 ;
846 828
847lastcomma : /* empty */ 829lastcomma : /* empty */
@@ -881,37 +863,22 @@ lfieldlist1 : expr1 {$$=1;}
881 } 863 }
882 ; 864 ;
883 865
884varlist1 : var 866varlist1 : var { $$ = 1; add_varbuffer($1, 0); }
885 { 867 | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; }
886 $$ = 1;
887 add_varbuffer($1, 0);
888 }
889 | varlist1 ',' var
890 {
891 add_varbuffer($3, $1);
892 $$ = $1+1;
893 }
894 ; 868 ;
895 869
896var : singlevar { $$ = $1; } 870var : NAME { $$ = singlevar($1, currState); }
897 | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */ 871 | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */
898 | varexp '.' NAME { code_string($3); $$ = 0; }/* ind. var. */ 872 | varexp '.' NAME { code_string($3); $$ = 0; }/* ind. var. */
899 ; 873 ;
900 874
901singlevar : NAME { $$ = singlevar($1, currState); }
902 ;
903
904varexp : var { lua_pushvar($1); } 875varexp : var { lua_pushvar($1); }
905 | '%' NAME { pushupvalue($2); } 876 | '%' NAME { pushupvalue($2); }
906 ; 877 ;
907 878
908localdeclist : NAME {store_localvar($1, 0); $$ = 1;} 879localnamelist : NAME {store_localvar($1, 0); $$ = 1;}
909 | localdeclist ',' NAME 880 | localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; }
910 { 881 ;
911 store_localvar($3, $1);
912 $$ = $1+1;
913 }
914 ;
915 882
916decinit : /* empty */ { $$ = 0; } 883decinit : /* empty */ { $$ = 0; }
917 | '=' exprlist1 { $$ = $2; } 884 | '=' exprlist1 { $$ = $2; }