浏览代码

new syntax possibilities: f(x).x, etc; on the other hand,
"function ... (x)" now is more restricted.

Roberto Ierusalimschy 28 年之前
父节点
当前提交
498a934abf
共有 1 个文件被更改,包括 44 次插入42 次删除
  1. 44 42
      lua.stx

+ 44 - 42
lua.stx

@@ -1,6 +1,6 @@
 %{
 %{
 /*
 /*
-** $Id: lua.stx,v 1.27 1997/12/26 18:38:16 roberto Exp roberto $
+** $Id: lua.stx,v 1.28 1997/12/28 22:48:15 roberto Exp roberto $
 ** Syntax analizer and code generator
 ** Syntax analizer and code generator
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -651,13 +651,12 @@ TProtoFunc *luaY_parser (ZIO *z)
 %type <vInt> SaveWord, cond, GetPC, SaveWordPop, SaveWordPush
 %type <vInt> SaveWord, cond, GetPC, SaveWordPop, SaveWordPush
 %type <vLong> exprlist, exprlist1  /* if > 0, points to function return
 %type <vLong> exprlist, exprlist1  /* if > 0, points to function return
 	counter (which has list length); if <= 0, -list lenght */
 	counter (which has list length); if <= 0, -list lenght */
-%type <vLong> functioncall, expr  /* if != 0, points to function return
+%type <vLong> functioncall, expr, sexp  /* if != 0, points to function return
 					 counter */
 					 counter */
 %type <vInt>  varlist1, funcParams, funcvalue
 %type <vInt>  varlist1, funcParams, funcvalue
 %type <vInt>  fieldlist, localnamelist, decinit
 %type <vInt>  fieldlist, localnamelist, decinit
 %type <vInt>  ffieldlist1, lfieldlist1, ffieldlist, lfieldlist, part
 %type <vInt>  ffieldlist1, lfieldlist1, ffieldlist, lfieldlist, part
-%type <vLong> var, funcname  /* vardesc */
-%type <pFunc> body
+%type <vLong> var, varname, funcname /* vardesc */
 
 
 
 
 %left AND OR
 %left AND OR
@@ -672,8 +671,7 @@ TProtoFunc *luaY_parser (ZIO *z)
 %% /* beginning of rules section */
 %% /* beginning of rules section */
 
 
 
 
-chunk    : statlist ret
-         ;
+chunk    : statlist ret ;
 
 
 statlist : /* empty */
 statlist : /* empty */
 	 | statlist stat sc
 	 | statlist stat sc
@@ -721,7 +719,7 @@ stat   : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); }
          adjust_mult_assign($2, $3);
          adjust_mult_assign($2, $3);
        }
        }
 
 
-       | FUNCTION funcname body { func_onstack($3); storevar($2); }
+       | FUNCTION funcname body { storevar($2); }
        ;
        ;
 
 
 block    : {$<vInt>$ = L->currState->nlocalvar;} chunk
 block    : {$<vInt>$ = L->currState->nlocalvar;} chunk
@@ -732,18 +730,25 @@ block    : {$<vInt>$ = L->currState->nlocalvar;} chunk
          }
          }
          ;
          ;
 
 
-funcname	: var { $$ = var2store($1); init_func(); }
-		| varexp ':' NAME
+funcname : varname { $$ = $1; init_func(); }
+	|  fvarname '.' fname
+	{
+          $$ = 0;  /* flag indexed variable */
+	  init_func();
+	}
+	| fvarname ':' fname
 	{
 	{
-	  code_string($3);
           $$ = 0;  /* flag indexed variable */
           $$ = 0;  /* flag indexed variable */
 	  init_func();
 	  init_func();
 	  add_localvar(luaS_new("self"));
 	  add_localvar(luaS_new("self"));
 	}
 	}
 		;
 		;
 
 
-body :  '(' parlist ')' chunk END { $$ = close_func(); }
-		;
+fvarname : varname { lua_pushvar($1); } ;
+
+fname	: NAME { code_string($1); } ;
+
+body :  '(' parlist ')' chunk END { func_onstack(close_func()); } ;
 
 
 elsepart : /* empty */
 elsepart : /* empty */
 	 | ELSE block
 	 | ELSE block
@@ -758,8 +763,7 @@ ret	: /* empty */
           }
           }
 	;
 	;
 
 
-GetPC	: /* empty */ { $$ = L->currState->pc; }
-	;
+GetPC	: /* empty */ { $$ = L->currState->pc; } ;
 
 
 SaveWord : /* empty */
 SaveWord : /* empty */
 	{ $$ = L->currState->pc;
 	{ $$ = L->currState->pc;
@@ -768,17 +772,13 @@ SaveWord : /* empty */
 	}
 	}
 	 ;
 	 ;
 
 
-SaveWordPop : SaveWord { $$ = $1; deltastack(-1);  /* pop condition */ }
-	;
+SaveWordPop : SaveWord { $$ = $1; deltastack(-1);  /* pop condition */ } ;
 
 
-SaveWordPush : SaveWord { $$ = $1; deltastack(1);  /* push a value */ }
-	;
+SaveWordPush : SaveWord { $$ = $1; deltastack(1);  /* push a value */ } ;
 
 
-cond	:	expr1 SaveWordPop  { $$ = $2; }
-	 ;
+cond	:	expr1 SaveWordPop  { $$ = $2; } ;
 
 
-expr1	 : expr { adjust_functioncall($1, 1); }
-	 ;
+expr1	 : expr { adjust_functioncall($1, 1); } ;
 				
 				
 expr :  '(' expr ')'     { $$ = $2; }
 expr :  '(' expr ')'     { $$ = $2; }
      |  expr1 EQ  expr1	 { code_binop(EQOP);   $$ = 0; }
      |  expr1 EQ  expr1	 { code_binop(EQOP);   $$ = 0; }
@@ -795,19 +795,31 @@ expr :  '(' expr ')'     { $$ = $2; }
      |	expr1 CONC expr1 { code_binop(CONCOP);  $$ = 0; }
      |	expr1 CONC expr1 { code_binop(CONCOP);  $$ = 0; }
      |	'-' expr1 %prec UNARY	{ code_unop(MINUSOP); $$ = 0;}
      |	'-' expr1 %prec UNARY	{ code_unop(MINUSOP); $$ = 0;}
      |	NOT expr1	 { code_unop(NOTOP);  $$ = 0;}
      |	NOT expr1	 { code_unop(NOTOP);  $$ = 0;}
+     |  sexp             { $$ = $1;  /* simple expressions */ }
      |  table 		 { $$ = 0; }
      |  table 		 { $$ = 0; }
-     |  varexp           { $$ = 0;}
      |  NUMBER           { code_number($1); $$ = 0; }
      |  NUMBER           { code_number($1); $$ = 0; }
      |  STRING           { code_string($1); $$ = 0; }
      |  STRING           { code_string($1); $$ = 0; }
      |	NIL		 { adjuststack(-1); $$ = 0; }
      |	NIL		 { adjuststack(-1); $$ = 0; }
-     |  functioncall     { $$ = $1; }
-     |  FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; }
+     |  FUNCTION { init_func(); } body { $$ = 0; }
      |	expr1 AND SaveWordPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; }
      |	expr1 AND SaveWordPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; }
      |	expr1 OR SaveWordPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; }
      |	expr1 OR SaveWordPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; }
      ;
      ;
 
 
-table : '{' SaveWordPush fieldlist '}' { fix_opcode($2, CREATEARRAY, 2, $3); }
-         ;
+sexp1	: sexp { adjust_functioncall($1, 1); } ;
+
+sexp	: var { lua_pushvar($1); $$ = 0; }
+	| '%' NAME { pushupvalue($2); $$ = 0; }
+	|  functioncall { $$ = $1; }
+	;
+
+var	  :	varname { $$ = $1; }
+	  |	sexp1 '[' expr1 ']' { $$ = 0; }  /* indexed variable */
+	  |	sexp1 '.' NAME { $$ = (-string_constant($3, L->currState))-1; }
+	  ;
+
+varname	  :	NAME { $$ = singlevar($1, L->currState); } ;
+
+table : '{' SaveWordPush fieldlist '}' { fix_opcode($2, CREATEARRAY, 2, $3); } ;
 
 
 functioncall : funcvalue funcParams
 functioncall : funcvalue funcParams
 	{
 	{
@@ -818,8 +830,8 @@ functioncall : funcvalue funcParams
 	}
 	}
 	     ;
 	     ;
 
 
-funcvalue    : varexp { $$ = 0; }
-	     | varexp ':' NAME
+funcvalue    : sexp1 { $$ = 0; }
+	     | sexp1 ':' NAME
 	     {
 	     {
                code_oparg(PUSHSELF, 0, string_constant($3, L->currState), 1);
                code_oparg(PUSHSELF, 0, string_constant($3, L->currState), 1);
                $$ = 1;
                $$ = 1;
@@ -891,11 +903,10 @@ ffieldlist1 : ffield			{$$=1;}
 		}
 		}
 	   ;
 	   ;
 
 
-ffield      : ffieldkey '=' expr1
-           ;
+ffield      : ffieldkey '=' expr1 ;
 
 
 ffieldkey   : '[' expr1 ']'
 ffieldkey   : '[' expr1 ']'
-	    | NAME { code_string($1); }
+	    | fname
 	    ;
 	    ;
 
 
 lfieldlist1 : expr1  {$$=1;}
 lfieldlist1 : expr1  {$$=1;}
@@ -910,20 +921,11 @@ lfieldlist1 : expr1  {$$=1;}
 varlist1  : var { $$ = 1; add_varbuffer($1, 0); }
 varlist1  : var { $$ = 1; add_varbuffer($1, 0); }
 	  | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; }
 	  | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; }
 	  ;
 	  ;
-		
-var	  :	NAME { $$ = singlevar($1, L->currState); }
-	  |	varexp '[' expr1 ']' { $$ = 0; }  /* indexed variable */
-	  |	varexp '.' NAME { $$ = (-string_constant($3, L->currState))-1; }
-	  ;
-		
-varexp	: var { lua_pushvar($1); }
-	| '%' NAME { pushupvalue($2); }
-	;
 
 
 localnamelist : NAME {store_localvar($1, 0); $$ = 1;}
 localnamelist : NAME {store_localvar($1, 0); $$ = 1;}
 	      | localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; }
 	      | localnamelist ',' NAME { store_localvar($3, $1); $$ = $1+1; }
 	      ;
 	      ;
-		
+
 decinit	  : /* empty */  { $$ = 0; }
 decinit	  : /* empty */  { $$ = 0; }
 	  | '=' exprlist1 { $$ = $2; }
 	  | '=' exprlist1 { $$ = $2; }
 	  ;
 	  ;