changeset 677:118971211c4c

Fixed parseDeclaratorSuffix().
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Fri, 18 Jan 2008 22:40:06 +0100
parents c4e3a34e40f1
children cedfc67faabf
files trunk/src/dil/parser/Parser.d
diffstat 1 files changed, 39 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/parser/Parser.d	Fri Jan 18 19:28:37 2008 +0100
+++ b/trunk/src/dil/parser/Parser.d	Fri Jan 18 22:40:06 2008 +0100
@@ -3588,35 +3588,49 @@
     return next.type == tok;
   }
 
-  Type parseDeclaratorSuffix(Type t)
+  /// Parse the C-style array types after the declarator.
+  Type parseDeclaratorSuffix(Type lhsType)
   {
-    switch (token.type)
+    // The Type chain should be as follows:
+    // int[3]* Identifier [][32]
+    //   <- <-              ->  -.
+    //       ^------------------ยด
+    // Resulting chain: [][32]*[3]int
+    Type parseNext() // Nested function required to accomplish this.
     {
-    case T.LBracket:
-      // Type Identifier ArrayType
-      // ArrayType := [] or [Type] or [Expression..Expression]
-      do
-        t = parseArrayType(t);
-      while (token.type == T.LBracket)
-      break;
-/+ // parsed in parseDeclaration()
-    case T.LParen:
-      TemplateParameters tparams;
-      if (tokenAfterParenIs(T.LParen))
+      if (token.type != T.LBracket)
+        return lhsType; // Break recursion; return Type on the left hand side of the Identifier.
+
+      auto begin = token;
+      Type t;
+      nT();
+      if (skipped(T.RBracket))
+        t = new ArrayType(parseNext()); // [ ]
+      else
       {
-        // ( TemplateParameterList ) ( ParameterList )
-        tparams = parseTemplateParameterList();
+        bool success;
+        Type parseAAType()
+        {
+          auto type = parseType();
+          require(T.RBracket);
+          return type;
+        }
+        auto assocType = try_(&parseAAType, success);
+        if (success)
+          t = new ArrayType(parseNext(), assocType); // [ Type ]
+        else
+        {
+          Expression e = parseExpression(), e2;
+          if (skipped(T.Slice))
+            e2 = parseExpression();
+          require(T.RBracket);
+          t = new ArrayType(parseNext(), e, e2); // [ Expression .. Expression ]
+        }
       }
-
-      auto params = parseParameterList();
-      // ReturnType FunctionName ( ParameterList )
-      t = new FunctionType(t, params, tparams);
-      break;
-+/
-    default:
-      break;
+      set(t, begin);
+      return t;
     }
-    return t;
+    return parseNext();
   }
 
   Type parseArrayType(Type t)
@@ -3643,8 +3657,8 @@
         Expression e = parseExpression(), e2;
         if (skipped(T.Slice))
           e2 = parseExpression();
+        require(T.RBracket);
         t = new ArrayType(t, e, e2);
-        require(T.RBracket);
       }
     }
     set(t, begin);