changeset 125:240a8b053803

- Added method parseStaticIfDeclaration and added class StaticIfDeclaration.
author aziz
date Mon, 09 Jul 2007 21:52:01 +0000
parents d4c4cea6ee7f
children 0f0e7352e91d
files trunk/src/Declarations.d trunk/src/Parser.d
diffstat 2 files changed, 56 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Declarations.d	Mon Jul 09 21:07:03 2007 +0000
+++ b/trunk/src/Declarations.d	Mon Jul 09 21:52:01 2007 +0000
@@ -233,3 +233,16 @@
     this.elseDecls = elseDecls;
   }
 }
+
+class StaticIfDeclaration : Declaration
+{
+  Expression condition;
+  Declaration[] ifDecls, elseDecls;
+  this(Expression condition, Declaration[] ifDecls, Declaration[] elseDecls)
+  {
+    super(true);
+    this.condition = condition;
+    this.ifDecls = ifDecls;
+    this.elseDecls = elseDecls;
+  }
+}
--- a/trunk/src/Parser.d	Mon Jul 09 21:07:03 2007 +0000
+++ b/trunk/src/Parser.d	Mon Jul 09 21:52:01 2007 +0000
@@ -113,14 +113,22 @@
       Token t;
       lx.peek(t);
 
-      if (t.type == T.Import)
+      switch (t.type)
+      {
+      case T.Import:
         goto case T.Import;
-      else if (t.type == T.This)
+      case T.This:
         decl = parseStaticConstructorDeclaration();
-      else if (t.type == T.Tilde)
+        break;
+      case T.Tilde:
         decl = parseStaticDestructorDeclaration();
-      else
+        break;
+      case T.If:
+        decl = parseStaticIfDeclaration();
+        break;
+      default:
         goto case_AttributeSpecifier;
+      }
       break;
     case T.Import:
       decl = parseImportDeclaration();
@@ -704,6 +712,37 @@
     return new VersionDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls);
   }
 
+  Declaration parseStaticIfDeclaration()
+  {
+    assert(token.type == T.Static);
+
+    nT(); // Skip static keyword.
+    nT(); // Skip if keyword.
+
+    Expression condition;
+    Declaration[] ifDecls, elseDecls;
+
+    require(T.LParen);
+    condition = parseAssignExpression();
+    require(T.RParen);
+
+    if (token.type != T.Colon)
+      ifDecls = parseDeclarationsBlock();
+    else
+      expected(T.LBrace); // TODO: better error msg
+
+    if (token.type == T.Else)
+    {
+      nT();
+      if (token.type != T.Colon)
+        elseDecls = parseDeclarationsBlock();
+      else
+        expected(T.LBrace); // TODO: better error msg
+    }
+
+    return new StaticIfDeclaration(condition, ifDecls, elseDecls);
+  }
+
   /+++++++++++++++++++++++++++++
   + Expression parsing methods +
   +++++++++++++++++++++++++++++/