changeset 133:3924b1ee1302

- Added code for parsing function and delegate literal expressions.
author aziz
date Tue, 10 Jul 2007 21:10:04 +0000
parents c97a3f683d13
children a31aa0d6dd5e
files trunk/src/Expressions.d trunk/src/Parser.d
diffstat 2 files changed, 26 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Expressions.d	Tue Jul 10 20:13:04 2007 +0000
+++ b/trunk/src/Expressions.d	Tue Jul 10 21:10:04 2007 +0000
@@ -543,9 +543,12 @@
 {
   FunctionType func;
   Declaration[] decls;
-  this(FunctionType func, Declaration[] decls)
+  TOK funcTok;
+
+  this(FunctionType func, Declaration[] decls, TOK funcTok = TOK.Invalid)
   {
     this.func = func;
     this.decls = decls;
+    this.funcTok = funcTok;
   }
 }
--- a/trunk/src/Parser.d	Tue Jul 10 20:13:04 2007 +0000
+++ b/trunk/src/Parser.d	Tue Jul 10 21:10:04 2007 +0000
@@ -1244,14 +1244,30 @@
       e = new AssocArrayLiteralExpression(keys, values);
       break;
     case T.LBrace:
-      // TODO: parse delegate literals: FunctionBody
+      // DelegateLiteral := { DeclDefs }
+      require(T.LBrace);
+      auto decls = parseDeclarationDefinitions();
+      require(T.RBrace);
+      auto func = new FunctionType(null, Parameters.init);
+      e = new FunctionLiteralExpression(func, decls);
       break;
     case T.Function, T.Delegate:
-      // TODO: parse delegate/function literals:
-      // function Type? ( ArgumentList ) FunctionBody
-      // function FunctionBody
-      // delegate Type? ( ArgumentList ) FunctionBody
-      // delegate FunctionBody
+      // FunctionLiteral := (function|delegate) Type? '(' ArgumentList ')' '{' DeclDefs '}'
+      TOK funcTok = token.type;
+      nT(); // Skip function|delegate token.
+      Type returnType;
+      Parameters parameters;
+      if (token.type != T.LBrace)
+      {
+        if (token.type != T.LParen) // Optional return type
+          returnType = parseType();
+        parameters = parseParameters();
+      }
+      require(T.LBrace);
+      auto decls = parseDeclarationDefinitions();
+      require(T.RBrace);
+      auto func = new FunctionType(returnType, parameters);
+      e = new FunctionLiteralExpression(func, decls, funcTok);
       break;
     case T.Assert:
       Expression msg;