changeset 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
files trunk/src/Expressions.d trunk/src/Parser.d trunk/src/Types.d
diffstat 3 files changed, 116 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Expressions.d	Thu Jul 12 21:23:00 2007 +0000
+++ b/trunk/src/Expressions.d	Thu Jul 12 22:30:01 2007 +0000
@@ -306,6 +306,18 @@
   }
 }
 
+class DotTemplateInstanceExpression : UnaryExpression
+{
+  string ident;
+  TemplateArguments targs;
+  this(Expression e, string ident, TemplateArguments targs)
+  {
+    super(e);
+    this.ident = ident;
+    this.targs = targs;
+  }
+}
+
 class CallExpression : UnaryExpression
 {
   Expression[] args;
--- 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();
--- a/trunk/src/Types.d	Thu Jul 12 21:23:00 2007 +0000
+++ b/trunk/src/Types.d	Thu Jul 12 22:30:01 2007 +0000
@@ -130,8 +130,10 @@
   Delegate,
   Pointer,
   Array,
+  IdentifierList,
   Identifier,
   Typeof,
+  TemplateInstance,
   Specialization,
 }
 
@@ -163,6 +165,15 @@
   }
 }
 
+class IdentifierListType : Type
+{
+  Type[] identList;
+  this(Type[] identList)
+  {
+    super(TID.IdentifierList, null);
+  }
+}
+
 class IdentifierType : Type
 {
   string[] idents;
@@ -173,6 +184,11 @@
     this.idents = idents;
   }
 
+  this(string ident)
+  {
+    super(TID.Identifier, null);
+  }
+
   this(TID tid)
   {
     super(tid);
@@ -194,6 +210,18 @@
   }
 }
 
+class TemplateInstanceType : Type
+{
+  string ident;
+  TemplateArguments targs;
+  this(string ident, TemplateArguments targs)
+  {
+    super(TID.TemplateInstance, null);
+    this.ident = ident;
+    this.targs = targs;
+  }
+}
+
 class PointerType : Type
 {
   this(Type t)