# HG changeset patch # User aziz # Date 1184579761 0 # Node ID 70715b9e21090ada55b64978cb8538100b261fe9 # Parent 61f60112ac63be5a28d32f3f7d3a2a69ba329d8c - Implemented parseAttributeStatement(). - Parsing declarations in parseStatement() now. diff -r 61f60112ac63 -r 70715b9e2109 trunk/src/Parser.d --- a/trunk/src/Parser.d Mon Jul 16 08:22:00 2007 +0000 +++ b/trunk/src/Parser.d Mon Jul 16 09:56:01 2007 +0000 @@ -1303,21 +1303,27 @@ switch (token.type) { case T.Extern, - T.Align, -// T.Pragma, + T.Align: + d = parseAttributeSpecifier(); + goto case_DeclarationStatement; +/+ Not applicable for statements. // T.Deprecated, // T.Private, // T.Package, // T.Protected, // T.Public, // T.Export, - //T.Static, - T.Final, // T.Override, // T.Abstract, ++/ + //T.Pragma, + //T.Static, + case T.Final, T.Const, T.Auto/+, T.Scope+/: + case_parseAttribute: + s = parseAttributeStatement(); break; case T.Identifier: Token next; @@ -1330,10 +1336,25 @@ s = new LabeledStatement(ident, parseNoScopeStatement()); break; } - goto case_Declaration; - case_Declaration: - // TODO: parse Declaration - break; + goto case_parseDeclaration; + // Declaration + case T.Dot, T.Typeof: + bool failed; + d = try_(parseDeclaration(), failed); + if (!failed) + goto case_DeclarationStatement; + else + goto default; // Expression + // BasicType + case T.Char, T.Wchar, T.Dchar, T.Bool, + T.Byte, T.Ubyte, T.Short, T.Ushort, + T.Int, T.Uint, T.Long, T.Ulong, + T.Float, T.Double, T.Real, + T.Ifloat, T.Idouble, T.Ireal, + T.Cfloat, T.Cdouble, T.Creal, T.Void: + case_parseDeclaration: + d = parseDeclaration(); + goto case_DeclarationStatement; case T.If: s = parseIfStatement(); break; @@ -1383,7 +1404,7 @@ Token next; lx.peek(next); if (next.type != T.LParen) - goto case_Declaration; + goto case_parseAttribute; s = parseScopeGuardStatement(); break; case T.Volatile: @@ -1410,7 +1431,7 @@ s = parseStaticAssertStatement(); break; default: - goto case_Declaration; + goto case_parseAttribute; } assert(0); case T.Debug: @@ -1500,6 +1521,25 @@ return s; } + Statement parseAttributeStatement() + { + switch (token.type) + { + case T.Static, + T.Final, + T.Const, + T.Auto, + T.Scope: + TOK tok = token.type; + nT(); + //if (token.type == T.LBrace) + // TODO: issue error msg. + return new AttributeStatement(tok, parseStatement()); + default: + } + assert(0); + } + Statement parseIfStatement() { assert(token.type == T.If); diff -r 61f60112ac63 -r 70715b9e2109 trunk/src/Statements.d --- a/trunk/src/Statements.d Mon Jul 16 08:22:00 2007 +0000 +++ b/trunk/src/Statements.d Mon Jul 16 09:56:01 2007 +0000 @@ -372,3 +372,14 @@ this.elseBody = elseBody; } } + +class AttributeStatement : Statement +{ + TOK tok; + Statement statement; + this(TOK tok, Statement statement) + { + this.tok = tok; + this.statement = statement; + } +}