Mercurial > projects > dil
diff trunk/src/Parser.d @ 153:66790fc2c0a2
- Added method parseIdentifierListType().
- Added code for parsing DotTemplateInstanceExpression.
- Added code for parsing TemplateInstanceExpression.
- Calling parseIdentifierListType() in parseBasicType().
- Added IdentifierListType and TemplateInstanceType.
author | aziz |
---|---|
date | Thu, 12 Jul 2007 22:30:01 +0000 |
parents | fe2e36eb4b45 |
children | 0e7cefb15e43 |
line wrap: on
line diff
--- a/trunk/src/Parser.d Thu Jul 12 21:23:00 2007 +0000 +++ b/trunk/src/Parser.d Thu Jul 12 22:30:01 2007 +0000 @@ -913,15 +913,15 @@ } // IdentifierListExpression: - // .IdentifierList - // IdentifierList - // Typeof - // Typeof . IdentifierList + // .IdentifierList + // IdentifierList + // Typeof + // Typeof . IdentifierList // IdentifierList: - // Identifier - // Identifier . IdentifierList - // TemplateInstance - // TemplateInstance . IdentifierList + // Identifier + // Identifier . IdentifierList + // TemplateInstance + // TemplateInstance . IdentifierList // TemplateInstance: // Identifier !( TemplateArgumentList ) IdentifierListExpression parseIdentifierListExpression() @@ -964,6 +964,45 @@ return new IdentifierListExpression(identList); } + IdentifierListType parseIdentifierListType() + { + Type[] identList; + if (token.type == T.Dot) + { + nT(); + identList ~= new IdentifierType("."); + } + else if (token.type == T.Typeof) + { + requireNext(T.LParen); + identList ~= new TypeofType(parseExpression()); + require(T.RParen); + if (token.type != T.Dot) + return new IdentifierListType(identList); + nT(); + } + + while (1) + { + string ident = requireIdentifier(); + Token next; + lx.peek(next); + if (token.type == T.Not && next.type == T.LParen) // Identifier !( TemplateArguments ) + { + nT(); // Skip !. + identList ~= new TemplateInstanceType(ident, parseTemplateArguments()); + } + else // Identifier + identList ~= new IdentifierType(ident); + + if (token.type != T.Dot) + break; + nT(); + } + + return new IdentifierListType(identList); + } + /* TemplateMixin: mixin ( AssignExpression ) ; @@ -1322,8 +1361,20 @@ nT(); if (token.type == T.Identifier) { - e = new DotIdExpression(e, token.identifier); - break; + string ident = token.identifier; + nT(); + Token next; + lx.peek(next); + if (token.type == T.Not && next.type == T.LParen) // Identifier !( TemplateArguments ) + { + nT(); // Skip !. + e = new DotTemplateInstanceExpression(e, ident, parseTemplateArguments()); + } + else + { + e = new DotIdExpression(e, ident); + nT(); + } } else if (token.type == T.New) e = parseNewExpression(e); @@ -1380,8 +1431,17 @@ switch (token.type) { case T.Identifier: - e = new IdentifierExpression(token.identifier); + string ident = token.identifier; nT(); + Token next; + lx.peek(next); + if (token.type == T.Not && next.type == T.LParen) // Identifier !( TemplateArguments ) + { + nT(); // Skip !. + e = new TemplateInstanceExpression(ident, parseTemplateArguments()); + } + else + e = new IdentifierExpression(ident); break; case T.Dot: nT(); @@ -1697,6 +1757,7 @@ t = new Type(token.type); nT(); break; +/+ case T.Identifier, T.Dot: tident = new IdentifierType([token.identifier]); nT(); @@ -1719,6 +1780,10 @@ tident = new TypeofType(parseExpression()); require(T.RParen); goto Lident; ++/ + case T.Identifier, T.Typeof, T.Dot: + t = parseIdentifierListType(); + break; default: // TODO: issue error msg. t = new UndefinedType();