diff trunk/src/Parser.d @ 190:d0712601fa47

- Implemented parseDebugStatement() and parseVersionStatement().
author aziz
date Sat, 14 Jul 2007 19:47:01 +0000
parents 5c6ebf9f60a9
children 3ce110cefbc5
line wrap: on
line diff
--- a/trunk/src/Parser.d	Sat Jul 14 18:50:03 2007 +0000
+++ b/trunk/src/Parser.d	Sat Jul 14 19:47:01 2007 +0000
@@ -762,7 +762,7 @@
       decls = parseDeclarationsBlock();
 
       // else DeclarationsBlock
-      // debug without condition and else statement makes no sense
+      // debug without condition and else body makes no sense
       if (token.type == T.Else && (levelCond != -1 || identCond.length != 0))
       {
         nT();
@@ -1215,6 +1215,12 @@
         goto case_Declaration;
       }
       assert(0);
+    case T.Debug:
+      s = parseDebugStatement();
+      break;
+    case T.Version:
+      s = parseVersionStatement();
+      break;
     case T.Enum:
       d = parseEnumDeclaration();
       goto case_DeclarationStatement;
@@ -1710,6 +1716,119 @@
     return new StaticAssertStatement(condition, message);
   }
 
+  Statement parseDebugStatement()
+  {
+    assert(token.type == T.Debug);
+    nT(); // Skip debug keyword.
+
+//     int levelSpec = -1; // debug = Integer ;
+//     string identSpec;   // debug = Identifier ;
+    int levelCond = -1; // debug ( Integer )
+    string identCond;   // debug ( Identifier )
+    Statement debugBody, elseBody;
+
+    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
+        expected(T.Identifier); // TODO: better error msg
+      nT();
+    }
+
+//     if (token.type == T.Assign)
+//     {
+//       parseIdentOrInt(identSpec, levelSpec);
+//       require(T.Semicolon);
+//     }
+//     else
+    {
+      // Condition:
+      //     Integer
+      //     Identifier
+
+      // ( Condition )
+      if (token.type == T.LParen)
+      {
+        parseIdentOrInt(identCond, levelCond);
+        require(T.RParen);
+      }
+
+      // debug Statement
+      // debug ( Condition ) Statement
+      debugBody = parseNoScopeStatement();
+
+      // else Statement
+      if (token.type == T.Else)
+      {
+        // debug without condition and else body makes no sense
+        //if (levelCond == -1 && identCond.length == 0)
+          // TODO: issue error msg
+        nT();
+        elseBody = parseNoScopeStatement();
+      }
+    }
+
+    return new DebugStatement(/+levelSpec, identSpec,+/ levelCond, identCond, debugBody, elseBody);
+  }
+
+  Statement parseVersionStatement()
+  {
+    assert(token.type == T.Version);
+
+    nT(); // Skip version keyword.
+
+//     int levelSpec = -1; // version = Integer ;
+//     string identSpec;   // version = Identifier ;
+    int levelCond = -1; // version ( Integer )
+    string identCond;   // version ( Identifier )
+    Statement versionBody, elseBody;
+
+    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
+        expected(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 ) Statement
+      versionBody = parseNoScopeStatement();
+
+      // else Statement
+      if (token.type == T.Else)
+      {
+        nT();
+        elseBody = parseNoScopeStatement();
+      }
+    }
+
+    return new VersionStatement(/+levelSpec, identSpec,+/ levelCond, identCond, versionBody, elseBody);
+  }
+
   /+++++++++++++++++++++++++++++
   + Assembler parsing methods  +
   +++++++++++++++++++++++++++++/