Mercurial > projects > dil
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);