changeset 335:b245b234fdd9

- Moved parsePostExpression() above parseUnaryExpression(). - parseMulExpression() calls parsePostExpression() now.
author aziz
date Wed, 22 Aug 2007 09:51:02 +0000
parents ca8ad7c34d6a
children 074b5ebe17c7
files trunk/src/dil/Parser.d
diffstat 1 files changed, 63 insertions(+), 121 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Parser.d	Wed Aug 22 09:45:00 2007 +0000
+++ b/trunk/src/dil/Parser.d	Wed Aug 22 09:51:02 2007 +0000
@@ -3095,16 +3095,17 @@
 
   Expression parseMulExpression()
   {
+    alias parsePostExpression parseNext;
     auto begin = token;
-    auto e = parseUnaryExpression();
+    auto e = parseNext();
     while (1)
     {
       auto operator = token;
       switch (operator.type)
       {
-      case T.Mul: nT(); e = new MulExpression(e, parseUnaryExpression(), operator); break;
-      case T.Div: nT(); e = new DivExpression(e, parseUnaryExpression(), operator); break;
-      case T.Mod: nT(); e = new ModExpression(e, parseUnaryExpression(), operator); break;
+      case T.Mul: nT(); e = new MulExpression(e, parseNext(), operator); break;
+      case T.Div: nT(); e = new DivExpression(e, parseNext(), operator); break;
+      case T.Mod: nT(); e = new ModExpression(e, parseNext(), operator); break;
       default:
         return e;
       }
@@ -3113,6 +3114,63 @@
     assert(0);
   }
 
+  Expression parsePostExpression()
+  {
+    auto begin = token;
+    auto e = parseUnaryExpression();
+    while (1)
+    {
+      switch (token.type)
+      {
+      case T.Dot:
+        e = new PostDotListExpression(e, parseDotListExpression());
+        goto Lset;
+      case T.PlusPlus:
+        e = new PostIncrExpression(e);
+        break;
+      case T.MinusMinus:
+        e = new PostDecrExpression(e);
+        break;
+      case T.LParen:
+        e = new CallExpression(e, parseArguments(T.RParen));
+        goto Lset;
+      case T.LBracket:
+        // parse Slice- and IndexExpression
+        nT();
+        if (token.type == T.RBracket)
+        {
+          e = new SliceExpression(e, null, null);
+          break;
+        }
+
+        Expression[] es = [parseAssignExpression()];
+
+        if (token.type == T.Slice)
+        {
+          nT();
+          e = new SliceExpression(e, es[0], parseAssignExpression());
+          require(T.RBracket);
+          goto Lset;
+        }
+        else if (token.type == T.Comma)
+        {
+           es ~= parseArguments(T.RBracket);
+        }
+        else
+          require(T.RBracket);
+
+        e = new IndexExpression(e, es);
+        goto Lset;
+      default:
+        return e;
+      }
+      nT();
+    Lset:
+      set(e, begin);
+    }
+    assert(0);
+  }
+
   Expression parseUnaryExpression()
   {
     auto begin = token;
@@ -3199,7 +3257,7 @@
       }
       goto default;
     default:
-      e = parsePostExpression(parsePrimaryExpression());
+      e = parsePrimaryExpression();
       return e;
     }
     assert(e !is null);
@@ -3207,112 +3265,12 @@
     return e;
   }
 
-  Expression parsePostExpression(Expression e)
-  {
-    typeof(token) begin;
-    while (1)
-    {
-      begin = token;
-      switch (token.type)
-      {
-/*
-// Commented out because parseDotListExpression() handles this.
-      case T.Dot:
-        nT();
-        if (token.type == T.Identifier)
-        {
-          string ident = token.identifier;
-          nT();
-          if (token.type == T.Not && peekNext() == 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);
-        else
-          expected(T.Identifier);
-        continue;
-*/
-      case T.Dot:
-        e = new PostDotListExpression(e, parseDotListExpression());
-        goto Lset;
-      case T.PlusPlus:
-        e = new PostIncrExpression(e);
-        break;
-      case T.MinusMinus:
-        e = new PostDecrExpression(e);
-        break;
-      case T.LParen:
-        e = new CallExpression(e, parseArguments(T.RParen));
-        goto Lset;
-      case T.LBracket:
-        // parse Slice- and IndexExpression
-        nT();
-        if (token.type == T.RBracket)
-        {
-          e = new SliceExpression(e, null, null);
-          break;
-        }
-
-        Expression[] es = [parseAssignExpression()];
-
-        if (token.type == T.Slice)
-        {
-          nT();
-          e = new SliceExpression(e, es[0], parseAssignExpression());
-          require(T.RBracket);
-          goto Lset;
-        }
-        else if (token.type == T.Comma)
-        {
-           es ~= parseArguments(T.RBracket);
-        }
-        else
-          require(T.RBracket);
-
-        e = new IndexExpression(e, es);
-        goto Lset;
-      default:
-        return e;
-      }
-      nT();
-    Lset:
-      set(e, begin);
-    }
-    assert(0);
-  }
-
   Expression parsePrimaryExpression()
   {
     auto begin = token;
     Expression e;
     switch (token.type)
     {
-/*
-// Commented out because parseDotListExpression() handles this.
-    case T.Identifier:
-      string ident = token.identifier;
-      nT();
-      if (token.type == T.Not && peekNext() == T.LParen) // Identifier !( TemplateArguments )
-      {
-        nT(); // Skip !.
-        e = new TemplateInstanceExpression(ident, parseTemplateArguments());
-      }
-      else
-        e = new IdentifierExpression(ident);
-      break;
-    case T.Dot:
-      nT();
-      e = new IdentifierExpression(".");
-      break;
-*/
     case T.Identifier, T.Dot, T.Typeof:
       e = parseDotListExpression();
       break;
@@ -3447,22 +3405,6 @@
       require(T.RParen);
       e = new TypeidExpression(type);
       break;
-/*
-// Commented out because parseDotListExpression() handles this.
-    case T.Typeof:
-      requireNext(T.LParen);
-      auto type = new TypeofType(parseExpression());
-      require(T.RParen);
-      if (token.type == T.Dot)
-      { // typeof ( Expression ) . Identifier
-        nT();
-        string ident = requireIdentifier;
-        e = new TypeDotIdExpression(type, ident);
-      }
-      else // typeof ( Expression )
-        e = new TypeofExpression(type);
-      break;
-*/
     case T.Is:
       requireNext(T.LParen);