changeset 404:fe46b5ea7a18

Added method parseDeclarationsBlockNoColon(). Fix: some declarations can't be followed by a colon-block.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sun, 23 Sep 2007 18:42:36 +0200
parents e7228859d865
children e2529923a0cb
files trunk/src/dil/Parser.d
diffstat 1 files changed, 14 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Parser.d	Sat Sep 22 23:49:52 2007 +0200
+++ b/trunk/src/dil/Parser.d	Sun Sep 23 18:42:36 2007 +0200
@@ -348,7 +348,7 @@
         { DeclDefs }
         DeclDef
   */
-  Declaration parseDeclarationsBlock()
+  Declaration parseDeclarationsBlock(bool noColon = false)
   {
     Declaration d;
     switch (token.type)
@@ -357,6 +357,8 @@
       d = parseDeclarationDefinitionsBlock();
       break;
     case T.Colon:
+      if (noColon == true)
+        goto default;
       nT();
       auto decls = new Declarations;
       while (token.type != T.RBrace && token.type != T.EOF)
@@ -369,6 +371,11 @@
     return d;
   }
 
+  Declaration parseDeclarationsBlockNoColon()
+  {
+    return parseDeclarationsBlock(true);
+  }
+
   Declaration parseDeclaration(StorageClass stc = StorageClass.None)
   {
     Type type;
@@ -1214,15 +1221,13 @@
 
       // debug DeclarationsBlock
       // debug ( Condition ) DeclarationsBlock
-      decls = parseDeclarationsBlock();
+      decls = parseDeclarationsBlockNoColon();
 
       // else DeclarationsBlock
       if (token.type == T.Else)
       {
         nT();
-        //if (token.type == T.Colon)
-          // TODO: avoid "else:"?
-        elseDecls = parseDeclarationsBlock();
+        elseDecls = parseDeclarationsBlockNoColon();
       }
     }
 
@@ -1271,15 +1276,13 @@
       require(T.RParen);
 
       // version ( Condition ) DeclarationsBlock
-      decls = parseDeclarationsBlock();
+      decls = parseDeclarationsBlockNoColon();
 
       // else DeclarationsBlock
       if (token.type == T.Else)
       {
         nT();
-        //if (token.type == T.Colon)
-          // TODO: avoid "else:"?
-        elseDecls = parseDeclarationsBlock();
+        elseDecls = parseDeclarationsBlockNoColon();
       }
     }
 
@@ -1300,18 +1303,12 @@
     condition = parseAssignExpression();
     require(T.RParen);
 
-    if (token.type != T.Colon)
-      ifDecls = parseDeclarationsBlock();
-    else
-      expected(T.LBrace); // TODO: better error msg
+    ifDecls = parseDeclarationsBlockNoColon();
 
     if (token.type == T.Else)
     {
       nT();
-      if (token.type != T.Colon)
-        elseDecls = parseDeclarationsBlock();
-      else
-        expected(T.LBrace); // TODO: better error msg
+      elseDecls = parseDeclarationsBlockNoColon();
     }
 
     return new StaticIfDeclaration(condition, ifDecls, elseDecls);