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 ) ;