diff options
| -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; } |
