# HG changeset patch # User aziz # Date 1184248500 0 # Node ID 8180eb84e69c45efe98092f6022e31e9663c8101 # Parent f401bd3feb2d22c5ff59ea7bb84c3b3a036cfd88 - Started implementation of parseAttributeSpecifier(). - Added case T.Version. - Added classes ExternDeclaration and AlignDeclaration. diff -r f401bd3feb2d -r 8180eb84e69c trunk/src/Declarations.d --- 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; + } +} diff -r f401bd3feb2d -r 8180eb84e69c trunk/src/Parser.d --- 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);