diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-12-29 15:28:45 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-12-29 15:28:45 -0200 |
commit | 498a934abf763ef1e436663ae40afea4f3a5075a (patch) | |
tree | 8a3fc2f7228b69caabedbf8d959ce92137fa48b3 | |
parent | ce5387268482aa5f214c3719084f1edab5188314 (diff) | |
download | lua-498a934abf763ef1e436663ae40afea4f3a5075a.tar.gz lua-498a934abf763ef1e436663ae40afea4f3a5075a.tar.bz2 lua-498a934abf763ef1e436663ae40afea4f3a5075a.zip |
new syntax possibilities: f(x).x, etc; on the other hand,
"function ... (x)" now is more restricted.
-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 | ; |