changeset 190:d0712601fa47

- Implemented parseDebugStatement() and parseVersionStatement().
author aziz
date Sat, 14 Jul 2007 19:47:01 +0000
parents b1060d432e5e
children 3ce110cefbc5
files trunk/src/Parser.d trunk/src/Statements.d
diffstat 2 files changed, 148 insertions(+), 1 deletions(-) [+]
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  +
   +++++++++++++++++++++++++++++/
--- a/trunk/src/Statements.d	Sat Jul 14 18:50:03 2007 +0000
+++ b/trunk/src/Statements.d	Sat Jul 14 19:47:01 2007 +0000
@@ -338,3 +338,31 @@
     this.message = message;
   }
 }
+
+class DebugStatement : Statement
+{
+  int levelCond;
+  string identCond;
+  Statement debugBody, elseBody;
+  this(int levelCond, string identCond, Statement debugBody, Statement elseBody)
+  {
+    this.levelCond = levelCond;
+    this.identCond = identCond;
+    this.debugBody = debugBody;
+    this.elseBody = elseBody;
+  }
+}
+
+class VersionStatement : Statement
+{
+  int levelCond;
+  string identCond;
+  Statement versionBody, elseBody;
+  this(int levelCond, string identCond, Statement versionBody, Statement elseBody)
+  {
+    this.levelCond = levelCond;
+    this.identCond = identCond;
+    this.versionBody = versionBody;
+    this.elseBody = elseBody;
+  }
+}