changeset 85:d8dc3171440d

- Fixed parsing CallExpression and IndexExpression. - Implemented parsing of ArrayLiteral- and AssocArrayLiteralExpressions. - Added classes ArrayLiteralExpression and AssocArrayLiteralExpression.
author aziz
date Thu, 05 Jul 2007 14:20:05 +0000
parents ac8d961d10d1
children 0459c902a370
files trunk/src/Expressions.d trunk/src/Parser.d
diffstat 2 files changed, 68 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Expressions.d	Thu Jul 05 10:35:04 2007 +0000
+++ b/trunk/src/Expressions.d	Thu Jul 05 14:20:05 2007 +0000
@@ -411,6 +411,23 @@
   { this.str = str; }
 }
 
+class ArrayLiteralExpression : Expression
+{
+  Expression[] values;
+  this(Expression[] values)
+  { this.values = values; }
+}
+
+class AssocArrayLiteralExpression : Expression
+{
+  Expression[] keys, values;
+  this(Expression[] keys, Expression[] values)
+  {
+    this.keys = keys;
+    this.values = values;
+  }
+}
+
 class AssertExpression
 {
 
--- a/trunk/src/Parser.d	Thu Jul 05 10:35:04 2007 +0000
+++ b/trunk/src/Parser.d	Thu Jul 05 14:20:05 2007 +0000
@@ -296,7 +296,6 @@
         e = new PostDecrExpression(e);
         break;
       case T.LParen:
-        nT();
         e = new CallExpression(e, parseArgumentList(T.LParen));
         break;
       case T.LBracket:
@@ -322,10 +321,11 @@
         {
            es ~= parseArgumentList(T.RBracket);
         }
+//         else if (lx.token.type != T.RBracket)
+//           error();
+        else
+          nT();
         e = new IndexExpression(e, es);
-//         if (lx.token.type != T.RBracket)
-//           error();
-        nT();
         break;
       }
     }
@@ -437,6 +437,53 @@
       e = new StringLiteralExpression(buffer);
       break;
     case T.LBracket:
+      Expression[] values;
+
+      nT();
+      if (lx.token.type != T.RBracket)
+      {
+        e = parseAssignExpression();
+        if (lx.token.type == T.Colon)
+          goto LparseAssocArray;
+        else if (lx.token.type == T.Comma)
+          values = [e] ~ parseArgumentList(T.RBracket);
+//         else if (lx.token.type != T.RBracket)
+//           error();
+      }
+
+      e = new ArrayLiteralExpression(values);
+      break;
+
+    LparseAssocArray:
+      Expression[] keys;
+
+      keys ~= e;
+      nT(); // Skip colon.
+      values ~= parseAssignExpression();
+
+      if (lx.token.type != T.RBracket)
+        while (1)
+        {
+          keys ~= parseAssignExpression();
+          if (lx.token.type != T.Colon)
+          {
+//             error();
+            values ~= null;
+            if (lx.token.type == T.RBracket)
+              break;
+            else
+              continue;
+          }
+          nT();
+          values ~= parseAssignExpression();
+          if (lx.token.type == T.RBracket)
+            break;
+//           if (lx.token.type != T.Comma)
+//             error();
+        }
+      assert(lx.token.type == T.RBracket);
+      nT();
+      e = new AssocArrayLiteralExpression(keys, values);
       break;
     case T.LBrace:
       break;