Mercurial > projects > dil
changeset 152:fe2e36eb4b45
- Added method parseIdentifierListExpression() and class IdentifierListExpression.
author | aziz |
---|---|
date | Thu, 12 Jul 2007 21:23:00 +0000 |
parents | 2e959f67000b |
children | 66790fc2c0a2 |
files | trunk/src/Expressions.d trunk/src/Parser.d |
diffstat | 2 files changed, 61 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Expressions.d Thu Jul 12 19:18:02 2007 +0000 +++ b/trunk/src/Expressions.d Thu Jul 12 21:23:00 2007 +0000 @@ -399,6 +399,15 @@ } } +class IdentifierListExpression : Expression +{ + Expression[] identList; + this(Expression[] identList) + { + this.identList = identList; + } +} + class TemplateInstanceExpression : Expression { string ident;
--- a/trunk/src/Parser.d Thu Jul 12 19:18:02 2007 +0000 +++ b/trunk/src/Parser.d Thu Jul 12 21:23:00 2007 +0000 @@ -912,6 +912,58 @@ return new DeleteDeclaration(parameters, decls); } + // IdentifierListExpression: + // .IdentifierList + // IdentifierList + // Typeof + // Typeof . IdentifierList + // IdentifierList: + // Identifier + // Identifier . IdentifierList + // TemplateInstance + // TemplateInstance . IdentifierList + // TemplateInstance: + // Identifier !( TemplateArgumentList ) + IdentifierListExpression parseIdentifierListExpression() + { + Expression[] identList; + if (token.type == T.Dot) + { + nT(); + identList ~= new IdentifierExpression("."); + } + else if (token.type == T.Typeof) + { + requireNext(T.LParen); + auto type = new TypeofType(parseExpression()); + require(T.RParen); + identList ~= new TypeofExpression(type); + if (token.type != T.Dot) + return new IdentifierListExpression(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 TemplateInstanceExpression(ident, parseTemplateArguments()); + } + else // Identifier + identList ~= new IdentifierExpression(ident); + + if (token.type != T.Dot) + break; + nT(); + } + + return new IdentifierListExpression(identList); + } + /* TemplateMixin: mixin ( AssignExpression ) ;