diff trunk/src/Parser.d @ 139:d48f345b05f8

- Implemented parseTemplateArgumentList(). - Restructure parseArgumentList().
author aziz
date Wed, 11 Jul 2007 14:22:05 +0000
parents 91b5187ed775
children 64d7186b087c
line wrap: on
line diff
--- a/trunk/src/Parser.d	Wed Jul 11 12:59:05 2007 +0000
+++ b/trunk/src/Parser.d	Wed Jul 11 14:22:05 2007 +0000
@@ -1549,7 +1549,7 @@
 
   Expression[] parseArgumentList(TOK terminator)
   {
-    Expression[] es;
+    Expression[] args;
 
     nT();
     if (token.type == terminator)
@@ -1558,15 +1558,16 @@
       return null;
     }
 
-    while (1)
+    goto LenterLoop;
+    do
     {
-      es ~= parseAssignExpression();
-      if (token.type == terminator)
-        break;
-      require(T.Comma);
-    }
-    nT();
-    return es;
+      nT();
+    LenterLoop:
+      args ~= parseAssignExpression();
+    } while (token.type == T.Comma)
+
+    require(terminator);
+    return args;
   }
 
   Parameters parseParameters()
@@ -1637,6 +1638,45 @@
     return params;
   }
 
+  Object[] parseTemplateArgumentList()
+  {
+    Object[] args;
+
+    require(T.LParen);
+    if (token.type == T.RParen)
+    {
+      nT();
+      return null;
+    }
+
+    goto LenterLoop;
+    do
+    {
+      nT(); // Skip comma.
+    LenterLoop:
+
+      bool failed;
+      auto typeArgument = try_(parseType(), failed);
+
+      if (!failed)
+      {
+        // TemplateArgument:
+        //         Type
+        //         Symbol
+        args ~= typeArgument;
+      }
+      else
+      {
+        // TemplateArgument:
+        //         AssignExpression
+        args ~= parseAssignExpression();
+      }
+    } while (token.type == T.Comma)
+
+    require(T.RParen);
+    return args;
+  }
+
   TemplateParameter[] parseTemplateParameters()
   {
     require(T.LParen);