diff options
| -rw-r--r-- | lua.stx | 86 |
1 files changed, 44 insertions, 42 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | /* | 2 | /* |
| 3 | ** $Id: lua.stx,v 1.27 1997/12/26 18:38:16 roberto Exp roberto $ | 3 | ** $Id: lua.stx,v 1.28 1997/12/28 22:48:15 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 | */ |
| @@ -651,13 +651,12 @@ TProtoFunc *luaY_parser (ZIO *z) | |||
| 651 | %type <vInt> SaveWord, cond, GetPC, SaveWordPop, SaveWordPush | 651 | %type <vInt> SaveWord, cond, GetPC, SaveWordPop, SaveWordPush |
| 652 | %type <vLong> exprlist, exprlist1 /* if > 0, points to function return | 652 | %type <vLong> exprlist, exprlist1 /* if > 0, points to function return |
| 653 | counter (which has list length); if <= 0, -list lenght */ | 653 | counter (which has list length); if <= 0, -list lenght */ |
| 654 | %type <vLong> functioncall, expr /* if != 0, points to function return | 654 | %type <vLong> functioncall, expr, sexp /* if != 0, points to function return |
| 655 | counter */ | 655 | counter */ |
| 656 | %type <vInt> varlist1, funcParams, funcvalue | 656 | %type <vInt> varlist1, funcParams, funcvalue |
| 657 | %type <vInt> fieldlist, localnamelist, decinit | 657 | %type <vInt> fieldlist, localnamelist, decinit |
| 658 | %type <vInt> ffieldlist1, lfieldlist1, ffieldlist, lfieldlist, part | 658 | %type <vInt> ffieldlist1, lfieldlist1, ffieldlist, lfieldlist, part |
| 659 | %type <vLong> var, funcname /* vardesc */ | 659 | %type <vLong> var, varname, funcname /* vardesc */ |
| 660 | %type <pFunc> body | ||
| 661 | 660 | ||
| 662 | 661 | ||
| 663 | %left AND OR | 662 | %left AND OR |
| @@ -672,8 +671,7 @@ TProtoFunc *luaY_parser (ZIO *z) | |||
| 672 | %% /* beginning of rules section */ | 671 | %% /* beginning of rules section */ |
| 673 | 672 | ||
| 674 | 673 | ||
| 675 | chunk : statlist ret | 674 | chunk : statlist ret ; |
| 676 | ; | ||
| 677 | 675 | ||
| 678 | statlist : /* empty */ | 676 | statlist : /* empty */ |
| 679 | | statlist stat sc | 677 | | statlist stat sc |
| @@ -721,7 +719,7 @@ stat : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); } | |||
| 721 | adjust_mult_assign($2, $3); | 719 | adjust_mult_assign($2, $3); |
| 722 | } | 720 | } |
| 723 | 721 | ||
| 724 | | FUNCTION funcname body { func_onstack($3); storevar($2); } | 722 | | FUNCTION funcname body { storevar($2); } |
| 725 | ; | 723 | ; |
| 726 | 724 | ||
| 727 | block : {$<vInt>$ = L->currState->nlocalvar;} chunk | 725 | block : {$<vInt>$ = L->currState->nlocalvar;} chunk |
| @@ -732,18 +730,25 @@ block : {$<vInt>$ = L->currState->nlocalvar;} chunk | |||
| 732 | } | 730 | } |
| 733 | ; | 731 | ; |
| 734 | 732 | ||
| 735 | funcname : var { $$ = var2store($1); init_func(); } | 733 | funcname : varname { $$ = $1; init_func(); } |
| 736 | | varexp ':' NAME | 734 | | fvarname '.' fname |
| 735 | { | ||
| 736 | $$ = 0; /* flag indexed variable */ | ||
| 737 | init_func(); | ||
| 738 | } | ||
| 739 | | fvarname ':' fname | ||
| 737 | { | 740 | { |
| 738 | code_string($3); | ||
| 739 | $$ = 0; /* flag indexed variable */ | 741 | $$ = 0; /* flag indexed variable */ |
| 740 | init_func(); | 742 | init_func(); |
| 741 | add_localvar(luaS_new("self")); | 743 | add_localvar(luaS_new("self")); |
| 742 | } | 744 | } |
| 743 | ; | 745 | ; |
| 744 | 746 | ||
| 745 | body : '(' parlist ')' chunk END { $$ = close_func(); } | 747 | fvarname : varname { lua_pushvar($1); } ; |
| 746 | ; | 748 | |
| 749 | fname : NAME { code_string($1); } ; | ||
| 750 | |||
| 751 | body : '(' parlist ')' chunk END { func_onstack(close_func()); } ; | ||
| 747 | 752 | ||
| 748 | elsepart : /* empty */ | 753 | elsepart : /* empty */ |
| 749 | | ELSE block | 754 | | ELSE block |
| @@ -758,8 +763,7 @@ ret : /* empty */ | |||
| 758 | } | 763 | } |
| 759 | ; | 764 | ; |
| 760 | 765 | ||
| 761 | GetPC : /* empty */ { $$ = L->currState->pc; } | 766 | GetPC : /* empty */ { $$ = L->currState->pc; } ; |
| 762 | ; | ||
| 763 | 767 | ||
| 764 | SaveWord : /* empty */ | 768 | SaveWord : /* empty */ |
| 765 | { $$ = L->currState->pc; | 769 | { $$ = L->currState->pc; |
| @@ -768,17 +772,13 @@ SaveWord : /* empty */ | |||
| 768 | } | 772 | } |
| 769 | ; | 773 | ; |
| 770 | 774 | ||
| 771 | SaveWordPop : SaveWord { $$ = $1; deltastack(-1); /* pop condition */ } | 775 | SaveWordPop : SaveWord { $$ = $1; deltastack(-1); /* pop condition */ } ; |
| 772 | ; | ||
| 773 | 776 | ||
| 774 | SaveWordPush : SaveWord { $$ = $1; deltastack(1); /* push a value */ } | 777 | SaveWordPush : SaveWord { $$ = $1; deltastack(1); /* push a value */ } ; |
| 775 | ; | ||
| 776 | 778 | ||
| 777 | cond : expr1 SaveWordPop { $$ = $2; } | 779 | cond : expr1 SaveWordPop { $$ = $2; } ; |
| 778 | ; | ||
| 779 | 780 | ||
| 780 | expr1 : expr { adjust_functioncall($1, 1); } | 781 | expr1 : expr { adjust_functioncall($1, 1); } ; |
| 781 | ; | ||
| 782 | 782 | ||
| 783 | expr : '(' expr ')' { $$ = $2; } | 783 | expr : '(' expr ')' { $$ = $2; } |
| 784 | | expr1 EQ expr1 { code_binop(EQOP); $$ = 0; } | 784 | | expr1 EQ expr1 { code_binop(EQOP); $$ = 0; } |
| @@ -795,19 +795,31 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 795 | | expr1 CONC expr1 { code_binop(CONCOP); $$ = 0; } | 795 | | expr1 CONC expr1 { code_binop(CONCOP); $$ = 0; } |
| 796 | | '-' expr1 %prec UNARY { code_unop(MINUSOP); $$ = 0;} | 796 | | '-' expr1 %prec UNARY { code_unop(MINUSOP); $$ = 0;} |
| 797 | | NOT expr1 { code_unop(NOTOP); $$ = 0;} | 797 | | NOT expr1 { code_unop(NOTOP); $$ = 0;} |
| 798 | | sexp { $$ = $1; /* simple expressions */ } | ||
| 798 | | table { $$ = 0; } | 799 | | table { $$ = 0; } |
| 799 | | varexp { $$ = 0;} | ||
| 800 | | NUMBER { code_number($1); $$ = 0; } | 800 | | NUMBER { code_number($1); $$ = 0; } |
| 801 | | STRING { code_string($1); $$ = 0; } | 801 | | STRING { code_string($1); $$ = 0; } |
| 802 | | NIL { adjuststack(-1); $$ = 0; } | 802 | | NIL { adjuststack(-1); $$ = 0; } |
| 803 | | functioncall { $$ = $1; } | 803 | | FUNCTION { init_func(); } body { $$ = 0; } |
| 804 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } | ||
| 805 | | expr1 AND SaveWordPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } | 804 | | expr1 AND SaveWordPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } |
| 806 | | expr1 OR SaveWordPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } | 805 | | expr1 OR SaveWordPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } |
| 807 | ; | 806 | ; |
| 808 | 807 | ||
| 809 | table : '{' SaveWordPush fieldlist '}' { fix_opcode($2, CREATEARRAY, 2, $3); } | 808 | sexp1 : sexp { adjust_functioncall($1, 1); } ; |
| 810 | ; | 809 | |
| 810 | sexp : var { lua_pushvar($1); $$ = 0; } | ||
| 811 | | '%' NAME { pushupvalue($2); $$ = 0; } | ||
| 812 | | functioncall { $$ = $1; } | ||
| 813 | ; | ||
| 814 | |||
| 815 | var : varname { $$ = $1; } | ||
| 816 | | sexp1 '[' expr1 ']' { $$ = 0; } /* indexed variable */ | ||
| 817 | | sexp1 '.' NAME { $$ = (-string_constant($3, L->currState))-1; } | ||
| 818 | ; | ||
| 819 | |||
| 820 | varname : NAME { $$ = singlevar($1, L->currState); } ; | ||
| 821 | |||
| 822 | table : '{' SaveWordPush fieldlist '}' { fix_opcode($2, CREATEARRAY, 2, $3); } ; | ||
| 811 | 823 | ||
| 812 | functioncall : funcvalue funcParams | 824 | functioncall : funcvalue funcParams |
| 813 | { | 825 | { |
| @@ -818,8 +830,8 @@ functioncall : funcvalue funcParams | |||
| 818 | } | 830 | } |
| 819 | ; | 831 | ; |
| 820 | 832 | ||
| 821 | funcvalue : varexp { $$ = 0; } | 833 | funcvalue : sexp1 { $$ = 0; } |
| 822 | | varexp ':' NAME | 834 | | sexp1 ':' NAME |
| 823 | { | 835 | { |
| 824 | code_oparg(PUSHSELF, 0, string_constant($3, L->currState), 1); | 836 | code_oparg(PUSHSELF, 0, string_constant($3, L->currState), 1); |
| 825 | $$ = 1; | 837 | $$ = 1; |
| @@ -891,11 +903,10 @@ ffieldlist1 : ffield {$$=1;} | |||
| 891 | } | 903 | } |
| 892 | ; | 904 | ; |
| 893 | 905 | ||
| 894 | ffield : ffieldkey '=' expr1 | 906 | ffield : ffieldkey '=' expr1 ; |
| 895 | ; | ||
| 896 | 907 | ||
| 897 | ffieldkey : '[' expr1 ']' | 908 | ffieldkey : '[' expr1 ']' |
| 898 | | NAME { code_string($1); } | 909 | | fname |
| 899 | ; | 910 | ; |
| 900 | 911 | ||
| 901 | lfieldlist1 : expr1 {$$=1;} | 912 | lfieldlist1 : expr1 {$$=1;} |
| @@ -910,20 +921,11 @@ lfieldlist1 : expr1 {$$=1;} | |||
| 910 | varlist1 : var { $$ = 1; add_varbuffer($1, 0); } | 921 | varlist1 : var { $$ = 1; add_varbuffer($1, 0); } |
| 911 | | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; } | 922 | | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; } |
| 912 | ; | 923 | ; |
| 913 | |||
| 914 | var : NAME { $$ = singlevar($1, L->currState); } | ||
| 915 | | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */ | ||
| 916 | | varexp '.' NAME { $$ = (-string_constant($3, L->currState))-1; } | ||
| 917 | ; | ||
| 918 | |||
| 919 | varexp : var { lua_pushvar($1); } | ||
| 920 | | '%' NAME { pushupvalue($2); } | ||
| 921 | ; | ||
| 922 | 924 | ||
| 923 | localnamelist : NAME {store_localvar($1, 0); $$ = 1;} | 925 | localnamelist : NAME {store_localvar($1, 0); $$ = 1;} |
| 924 | | localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; } | 926 | | localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; } |
| 925 | ; | 927 | ; |
| 926 | 928 | ||
| 927 | decinit : /* empty */ { $$ = 0; } | 929 | decinit : /* empty */ { $$ = 0; } |
| 928 | | '=' exprlist1 { $$ = $2; } | 930 | | '=' exprlist1 { $$ = $2; } |
| 929 | ; | 931 | ; |
