aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-12-29 15:28:45 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-12-29 15:28:45 -0200
commit498a934abf763ef1e436663ae40afea4f3a5075a (patch)
tree8a3fc2f7228b69caabedbf8d959ce92137fa48b3
parentce5387268482aa5f214c3719084f1edab5188314 (diff)
downloadlua-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.stx86
1 files changed, 44 insertions, 42 deletions
diff --git a/lua.stx b/lua.stx
index 7149b5e8..07e0d0cd 100644
--- a/lua.stx
+++ b/lua.stx
@@ -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
675chunk : statlist ret 674chunk : statlist ret ;
676 ;
677 675
678statlist : /* empty */ 676statlist : /* 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
727block : {$<vInt>$ = L->currState->nlocalvar;} chunk 725block : {$<vInt>$ = L->currState->nlocalvar;} chunk
@@ -732,18 +730,25 @@ block : {$<vInt>$ = L->currState->nlocalvar;} chunk
732 } 730 }
733 ; 731 ;
734 732
735funcname : var { $$ = var2store($1); init_func(); } 733funcname : 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
745body : '(' parlist ')' chunk END { $$ = close_func(); } 747fvarname : varname { lua_pushvar($1); } ;
746 ; 748
749fname : NAME { code_string($1); } ;
750
751body : '(' parlist ')' chunk END { func_onstack(close_func()); } ;
747 752
748elsepart : /* empty */ 753elsepart : /* empty */
749 | ELSE block 754 | ELSE block
@@ -758,8 +763,7 @@ ret : /* empty */
758 } 763 }
759 ; 764 ;
760 765
761GetPC : /* empty */ { $$ = L->currState->pc; } 766GetPC : /* empty */ { $$ = L->currState->pc; } ;
762 ;
763 767
764SaveWord : /* empty */ 768SaveWord : /* empty */
765 { $$ = L->currState->pc; 769 { $$ = L->currState->pc;
@@ -768,17 +772,13 @@ SaveWord : /* empty */
768 } 772 }
769 ; 773 ;
770 774
771SaveWordPop : SaveWord { $$ = $1; deltastack(-1); /* pop condition */ } 775SaveWordPop : SaveWord { $$ = $1; deltastack(-1); /* pop condition */ } ;
772 ;
773 776
774SaveWordPush : SaveWord { $$ = $1; deltastack(1); /* push a value */ } 777SaveWordPush : SaveWord { $$ = $1; deltastack(1); /* push a value */ } ;
775 ;
776 778
777cond : expr1 SaveWordPop { $$ = $2; } 779cond : expr1 SaveWordPop { $$ = $2; } ;
778 ;
779 780
780expr1 : expr { adjust_functioncall($1, 1); } 781expr1 : expr { adjust_functioncall($1, 1); } ;
781 ;
782 782
783expr : '(' expr ')' { $$ = $2; } 783expr : '(' 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
809table : '{' SaveWordPush fieldlist '}' { fix_opcode($2, CREATEARRAY, 2, $3); } 808sexp1 : sexp { adjust_functioncall($1, 1); } ;
810 ; 809
810sexp : var { lua_pushvar($1); $$ = 0; }
811 | '%' NAME { pushupvalue($2); $$ = 0; }
812 | functioncall { $$ = $1; }
813 ;
814
815var : varname { $$ = $1; }
816 | sexp1 '[' expr1 ']' { $$ = 0; } /* indexed variable */
817 | sexp1 '.' NAME { $$ = (-string_constant($3, L->currState))-1; }
818 ;
819
820varname : NAME { $$ = singlevar($1, L->currState); } ;
821
822table : '{' SaveWordPush fieldlist '}' { fix_opcode($2, CREATEARRAY, 2, $3); } ;
811 823
812functioncall : funcvalue funcParams 824functioncall : funcvalue funcParams
813 { 825 {
@@ -818,8 +830,8 @@ functioncall : funcvalue funcParams
818 } 830 }
819 ; 831 ;
820 832
821funcvalue : varexp { $$ = 0; } 833funcvalue : 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
894ffield : ffieldkey '=' expr1 906ffield : ffieldkey '=' expr1 ;
895 ;
896 907
897ffieldkey : '[' expr1 ']' 908ffieldkey : '[' expr1 ']'
898 | NAME { code_string($1); } 909 | fname
899 ; 910 ;
900 911
901lfieldlist1 : expr1 {$$=1;} 912lfieldlist1 : expr1 {$$=1;}
@@ -910,20 +921,11 @@ lfieldlist1 : expr1 {$$=1;}
910varlist1 : var { $$ = 1; add_varbuffer($1, 0); } 921varlist1 : 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
914var : NAME { $$ = singlevar($1, L->currState); }
915 | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */
916 | varexp '.' NAME { $$ = (-string_constant($3, L->currState))-1; }
917 ;
918
919varexp : var { lua_pushvar($1); }
920 | '%' NAME { pushupvalue($2); }
921 ;
922 924
923localnamelist : NAME {store_localvar($1, 0); $$ = 1;} 925localnamelist : 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
927decinit : /* empty */ { $$ = 0; } 929decinit : /* empty */ { $$ = 0; }
928 | '=' exprlist1 { $$ = $2; } 930 | '=' exprlist1 { $$ = $2; }
929 ; 931 ;