diff options
Diffstat (limited to 'lua.stx')
-rw-r--r-- | lua.stx | 87 |
1 files changed, 27 insertions, 60 deletions
@@ -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 | ||
425 | static void code_args (int dots) | 425 | static 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 | ||
647 | sc : /* empty */ | ';' ; | 647 | sc : /* empty */ | ';' ; |
648 | 648 | ||
649 | stat : IF cond THEN block SaveWord elsepart END | 649 | stat : 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 | ||
692 | block : {$<vInt>$ = currState->nlocalvar;} chunk | 690 | block : {$<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 | ||
713 | elsepart : /* empty */ | 711 | elsepart : /* 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 | ||
719 | ret : /* empty */ | 716 | ret : /* empty */ |
@@ -792,8 +789,7 @@ funcvalue : varexp { $$ = 0; } | |||
792 | } | 789 | } |
793 | ; | 790 | ; |
794 | 791 | ||
795 | funcParams : '(' exprlist ')' | 792 | funcParams : '(' 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 | ||
816 | parlist : /* empty */ { code_args(0); } | 811 | parlist : /* 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); } | |
820 | parlist1 : par { $$ = $1; } | ||
821 | | parlist1 ',' par | ||
822 | { | ||
823 | if ($1) | ||
824 | luaY_error("invalid parameter list"); | ||
825 | $$ = $3; | ||
826 | } | ||
827 | ; | 815 | ; |
828 | |||
829 | par : NAME { add_localvar($1); $$ = 0; } | ||
830 | | DOTS { $$ = 1; } | ||
831 | ; | ||
832 | 816 | ||
833 | fieldlist : lfieldlist | 817 | fieldlist : 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 | ||
841 | semicolonpart : /* empty */ | 825 | semicolonpart : /* 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 | ||
847 | lastcomma : /* empty */ | 829 | lastcomma : /* empty */ |
@@ -881,37 +863,22 @@ lfieldlist1 : expr1 {$$=1;} | |||
881 | } | 863 | } |
882 | ; | 864 | ; |
883 | 865 | ||
884 | varlist1 : var | 866 | varlist1 : 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 | ||
896 | var : singlevar { $$ = $1; } | 870 | var : 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 | ||
901 | singlevar : NAME { $$ = singlevar($1, currState); } | ||
902 | ; | ||
903 | |||
904 | varexp : var { lua_pushvar($1); } | 875 | varexp : var { lua_pushvar($1); } |
905 | | '%' NAME { pushupvalue($2); } | 876 | | '%' NAME { pushupvalue($2); } |
906 | ; | 877 | ; |
907 | 878 | ||
908 | localdeclist : NAME {store_localvar($1, 0); $$ = 1;} | 879 | localnamelist : 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 | ||
916 | decinit : /* empty */ { $$ = 0; } | 883 | decinit : /* empty */ { $$ = 0; } |
917 | | '=' exprlist1 { $$ = $2; } | 884 | | '=' exprlist1 { $$ = $2; } |