Browse Source

Improved syntax sugar for functions

gdouglas 14 years ago
parent
commit
b944ce433d
2 changed files with 47 additions and 15 deletions
  1. 4 0
      gmsrc/doc/ChangeLog.txt
  2. 43 15
      gmsrc/src/gm/gmParser.y

+ 4 - 0
gmsrc/doc/ChangeLog.txt

@@ -394,3 +394,7 @@ o Fixed GC tricolor invariance wasn't preserved with local object transfer of ow
 
 
 7/10/11
 7/10/11
 o Fixed GC (Another attempt)
 o Fixed GC (Another attempt)
+
+13/01/12
+o Improved syntactical sugar for functions. Thanks HenryTran.
+ 

+ 43 - 15
gmsrc/src/gm/gmParser.y

@@ -181,26 +181,54 @@ function_statement
   :
   :
     KEYWORD_FUNCTION identifier '(' ')' compound_statement
     KEYWORD_FUNCTION identifier '(' ')' compound_statement
     {
     {
-		gmCodeTreeNode* func = gmCodeTreeNode::Create(CTNT_EXPRESSION, CTNET_FUNCTION, gmlineno);
-		func->SetChild(1, $5);
-		
+      gmCodeTreeNode* func = gmCodeTreeNode::Create(CTNT_EXPRESSION, CTNET_FUNCTION, gmlineno);
+      func->SetChild(1, $5);
+      
 
 
-		$$ = gmCodeTreeNode::Create(CTNT_DECLARATION, CTNDT_VARIABLE, gmlineno, (int)GMMACHINE_DEFAULT_FUNCTION);
-		$$->SetChild(0, $2);
-		ATTACH($$, $$, CreateOperation(CTNOT_ASSIGN, $2, func));
-	}
+      $$ = gmCodeTreeNode::Create(CTNT_DECLARATION, CTNDT_VARIABLE, gmlineno, (int)GMMACHINE_DEFAULT_FUNCTION);
+      $$->SetChild(0, $2);
+      ATTACH($$, $$, CreateOperation(CTNOT_ASSIGN, $2, func));
+   }
   |
   |
     KEYWORD_FUNCTION identifier '(' parameter_list ')' compound_statement
     KEYWORD_FUNCTION identifier '(' parameter_list ')' compound_statement
     {
     {
-		gmCodeTreeNode* func = gmCodeTreeNode::Create(CTNT_EXPRESSION, CTNET_FUNCTION, gmlineno);
-		func->SetChild(0, $4);
-		func->SetChild(1, $6);
-		
+      gmCodeTreeNode* func = gmCodeTreeNode::Create(CTNT_EXPRESSION, CTNET_FUNCTION, gmlineno);
+      func->SetChild(0, $4);
+      func->SetChild(1, $6);
+      
 
 
-		$$ = gmCodeTreeNode::Create(CTNT_DECLARATION, CTNDT_VARIABLE, gmlineno, (int)GMMACHINE_DEFAULT_FUNCTION);
-		$$->SetChild(0, $2);
-		ATTACH($$, $$, CreateOperation(CTNOT_ASSIGN, $2, func));
-	}
+      $$ = gmCodeTreeNode::Create(CTNT_DECLARATION, CTNDT_VARIABLE, gmlineno, (int)GMMACHINE_DEFAULT_FUNCTION);
+      $$->SetChild(0, $2);
+      ATTACH($$, $$, CreateOperation(CTNOT_ASSIGN, $2, func));
+   }
+  |
+    KEYWORD_FUNCTION tablemember_expression '(' ')' compound_statement
+    {
+      gmCodeTreeNode* func = gmCodeTreeNode::Create(CTNT_EXPRESSION, CTNET_FUNCTION, gmlineno);
+      func->SetChild(1, $5);
+      
+      ATTACH($$, $$, CreateOperation(CTNOT_ASSIGN, $2, func));
+   }
+  |
+    KEYWORD_FUNCTION tablemember_expression '(' parameter_list ')' compound_statement
+    {
+      gmCodeTreeNode* func = gmCodeTreeNode::Create(CTNT_EXPRESSION, CTNET_FUNCTION, gmlineno);
+      func->SetChild(0, $4);
+      func->SetChild(1, $6);
+      
+      ATTACH($$, $$, CreateOperation(CTNOT_ASSIGN, $2, func));
+   }
+  ;
+ 
+tablemember_expression
+  : identifier '.' identifier
+    {
+      $$ = CreateOperation(CTNOT_DOT, $1, $3);
+    }
+  | tablemember_expression '.' identifier
+    {
+      $$ = CreateOperation(CTNOT_DOT, $1, $3);
+    }
   ;
   ;
   
   
 var_statement
 var_statement