changeset 146:8180eb84e69c

- Started implementation of parseAttributeSpecifier(). - Added case T.Version. - Added classes ExternDeclaration and AlignDeclaration.
author aziz
date Thu, 12 Jul 2007 13:55:00 +0000
parents f401bd3feb2d
children e46b3415ec16
files trunk/src/Declarations.d trunk/src/Parser.d
diffstat 2 files changed, 83 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Declarations.d	Thu Jul 12 10:38:01 2007 +0000
+++ b/trunk/src/Declarations.d	Thu Jul 12 13:55:00 2007 +0000
@@ -303,3 +303,27 @@
     this.decls = decls;
   }
 }
+
+class ExternDeclaration : Declaration
+{
+  string linkage;
+  Declaration[] decls;
+  this(string linkage, Declaration[] decls)
+  {
+    super(true);
+    this.linkage = linkage;
+    this.decls = decls;
+  }
+}
+
+class AlignDeclaration : Declaration
+{
+  int size;
+  Declaration[] decls;
+  this(int size, Declaration[] decls)
+  {
+    super(true);
+    this.size = size;
+    this.decls = decls;
+  }
+}
--- a/trunk/src/Parser.d	Thu Jul 12 10:38:01 2007 +0000
+++ b/trunk/src/Parser.d	Thu Jul 12 13:55:00 2007 +0000
@@ -166,6 +166,9 @@
     case T.Debug:
       decl = parseDebugDeclaration();
       break;
+    case T.Version:
+      decl = parseVersionDeclaration();
+      break;
     case T.Template:
       decl = parseTemplateDeclaration();
       break;
@@ -175,6 +178,9 @@
     case T.Delete:
       decl = parseDeleteDeclaration();
       break;
+    case T.Mixin:
+      // TODO: parse TemplateMixin
+      break;
     case T.Semicolon:
       nT();
       decl = new EmptyDeclaration();
@@ -227,9 +233,56 @@
 
   Declaration parseAttributeSpecifier()
   {
-    // Attribute :
-    // Attribute DeclarationBlock
-    return null;
+    Declaration decl;
+
+    switch (token.type)
+    {
+    case T.Extern:
+      nT();
+      string linkage;
+      if (token.type == T.LParen)
+      {
+        nT();
+        linkage = requireIdentifier();
+        require(T.RParen);
+      }
+      decl = new ExternDeclaration(linkage, parseDeclarationsBlock());
+      break;
+    case T.Align:
+      nT();
+      int size = -1;
+      if (token.type == T.LParen)
+      {
+        nT();
+        if (token.type == T.Int32)
+        {
+          size = token.int_;
+          nT();
+        }
+        else
+          expected(T.Int32);
+        require(T.RParen);
+      }
+      decl = new AlignDeclaration(size, parseDeclarationsBlock());
+      break;
+    case T.Pragma:
+    case T.Private:
+    case T.Package:
+    case T.Protected:
+    case T.Public:
+    case T.Export:
+    case T.Override:
+    case T.Deprecated:
+    case T.Abstract:
+    case T.Static:
+    case T.Final:
+    case T.Const:
+    case T.Auto:
+    case T.Scope:
+    default:
+      assert(0);
+    }
+    return decl;
   }
 
   Declaration parseImportDeclaration()
@@ -682,9 +735,9 @@
 
   Declaration parseVersionDeclaration()
   {
-    assert(token.type == T.Debug);
+    assert(token.type == T.Version);
 
-    nT(); // Skip debug keyword.
+    nT(); // Skip version keyword.
 
     int levelSpec = -1; // version = Integer ;
     string identSpec;   // version = Identifier ;
@@ -714,6 +767,7 @@
       // Condition:
       //     Integer
       //     Identifier
+
       // ( Condition )
       require(T.LParen);
       parseIdentOrInt(identCond, levelCond);