changeset 123:0f55c0ac6589

- Added method parseVersionDeclaration(). - Simplified parseDebugDeclaration(). - Added an assert statement to parseDeclarationsBlock().
author aziz
date Mon, 09 Jul 2007 21:04:02 +0000
parents 9849a263f148
children d4c4cea6ee7f
files trunk/src/Declarations.d trunk/src/Parser.d
diffstat 2 files changed, 102 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Declarations.d	Mon Jul 09 20:24:03 2007 +0000
+++ b/trunk/src/Declarations.d	Mon Jul 09 21:04:02 2007 +0000
@@ -213,3 +213,23 @@
     this.elseDecls = elseDecls;
   }
 }
+
+class VersionDeclaration : Declaration
+{
+  int levelSpec;
+  string identSpec;
+  int levelCond;
+  string identCond;
+  Declaration[] decls, elseDecls;
+
+  this(int levelSpec, string identSpec, int levelCond, string identCond, Declaration[] decls, Declaration[] elseDecls)
+  {
+    super(decls.length != 0);
+    this.levelSpec = levelSpec;
+    this.identSpec = identSpec;
+    this.levelCond = levelCond;
+    this.identCond = identCond;
+    this.decls = decls;
+    this.elseDecls = elseDecls;
+  }
+}
--- a/trunk/src/Parser.d	Mon Jul 09 20:24:03 2007 +0000
+++ b/trunk/src/Parser.d	Mon Jul 09 21:04:02 2007 +0000
@@ -184,6 +184,7 @@
     case T.Colon:
       nT();
       decls = parseDeclarationDefinitions();
+      assert(token.type == T.RBrace || token.type == T.EOF);
       break;
     default:
       decls ~= parseDeclarationDefinition();
@@ -599,60 +600,108 @@
     string identCond;   // debug ( Identifier )
     Declaration[] decls, elseDecls;
 
-    if (token.type == T.Assign)
+    void parseIdentOrInt(ref string ident, ref int level)
     {
       nT();
       if (token.type == T.Int32)
-        levelSpec = token.int_;
+        level = token.int_;
       else if (token.type == T.Identifier)
-        identSpec = token.identifier;
+        ident = token.identifier;
       else
         errorIfNot(T.Identifier); // TODO: better error msg
       nT();
+    }
+
+    if (token.type == T.Assign)
+    {
+      parseIdentOrInt(identSpec, levelSpec);
       require(T.Semicolon);
     }
     else
     {
-      // '(' (Identifier | Integer) ')'
+      // Condition:
+      //     Integer
+      //     Identifier
+      // ( Condition )
       if (token.type == T.LParen)
       {
-        nT();
-        if (token.type == T.Int32)
-          levelCond = token.int_;
-        else if (token.type == T.Identifier)
-          identCond = token.identifier;
-        else
-          errorIfNot(T.Identifier); // TODO: better error msg
-        nT();
+        parseIdentOrInt(identCond, levelCond);
         require(T.RParen);
       }
 
-      if (token.type == T.Colon)
-      {
-        // debug:
-        // "debug" '(' (Identifier | Integer) ')':
-        nT();
-        decls = parseDeclarationDefinitions();
-      }
-      else
+      // debug DeclarationsBlock
+      // debug ( Condition ) DeclarationsBlock
+      decls = parseDeclarationsBlock();
+
+      // else DeclarationsBlock
+      // debug without condition and else statement makes no sense
+      if (token.type == T.Else && (levelCond != -1 || identCond.length != 0))
       {
-        // debug DeclarationsBlock
-        // "debug" '(' (Identifier | Integer) ')' DeclarationsBlock
-        decls = parseDeclarationsBlock();
+        nT();
+        //if (token.type == T.Colon)
+          // TODO: avoid "else:"?
+        elseDecls = parseDeclarationsBlock();
+      }
+//       else
+        // TODO: issue error msg
+    }
+
+    return new DebugDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls);
+  }
+
+  Declaration parseVersionDeclaration()
+  {
+    assert(token.type == T.Debug);
+
+    nT(); // Skip debug keyword.
+
+    int levelSpec = -1; // version = Integer ;
+    string identSpec;   // version = Identifier ;
+    int levelCond = -1; // version ( Integer )
+    string identCond;   // version ( Identifier )
+    Declaration[] decls, elseDecls;
 
-        // else DeclarationsBlock
-        // debug without condition and else statement makes no sense
-        if (token.type == T.Else && (levelCond != -1 || identCond.length != 0))
-        {
-          nT();
-          //if (token.type == T.Colon)
-            // TODO: avoid "else:"?
-          elseDecls = parseDeclarationsBlock();
-        }
+    void parseIdentOrInt(ref string ident, ref int level)
+    {
+      nT();
+      if (token.type == T.Int32)
+        level = token.int_;
+      else if (token.type == T.Identifier)
+        ident = token.identifier;
+      else
+        errorIfNot(T.Identifier); // TODO: better error msg
+      nT();
+    }
+
+    if (token.type == T.Assign)
+    {
+      parseIdentOrInt(identSpec, levelSpec);
+      require(T.Semicolon);
+    }
+    else
+    {
+      // Condition:
+      //     Integer
+      //     Identifier
+      // ( Condition )
+      require(T.LParen);
+      parseIdentOrInt(identCond, levelCond);
+      require(T.RParen);
+
+      // version ( Condition ) DeclarationsBlock
+      decls = parseDeclarationsBlock();
+
+      // else DeclarationsBlock
+      if (token.type == T.Else)
+      {
+        nT();
+        //if (token.type == T.Colon)
+          // TODO: avoid "else:"?
+        elseDecls = parseDeclarationsBlock();
       }
     }
 
-    return new DebugDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls);
+    return new VersionDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls);
   }
 
   /+++++++++++++++++++++++++++++