changeset 169:4666a05dfacf

- Implemented parseForeachStatement().
author aziz
date Sat, 14 Jul 2007 09:34:04 +0000
parents fbbb2434bf6b
children a63696d1c474
files trunk/src/Parser.d trunk/src/Statements.d
diffstat 2 files changed, 65 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Parser.d	Sat Jul 14 09:01:05 2007 +0000
+++ b/trunk/src/Parser.d	Sat Jul 14 09:34:04 2007 +0000
@@ -1145,6 +1145,9 @@
     case T.Do:
       s = parseDoWhileStatement();
       break;
+    case T.Foreach, T.Foreach_reverse:
+      s = parseForeachStatement();
+      break;
     default:
       // TODO: issue error msg and return IllegalStatement.
     }
@@ -1289,6 +1292,55 @@
     return new ForStatement(init, condition, increment, forBody);
   }
 
+  Statement parseForeachStatement()
+  {
+    assert(token.type == T.Foreach || token.type == T.Foreach_reverse);
+    TOK tok = token.type;
+    nT();
+
+    Parameters params;
+    Expression aggregate;
+
+    require(T.LParen);
+    while (1)
+    {
+      StorageClass stc;
+      Type type;
+      string ident;
+
+      switch (token.type)
+      {
+      case T.Ref:
+        nT();
+        stc = StorageClass.Ref;
+        break;
+      case T.Identifier:
+        Token next;
+        lx.peek(next);
+        if (next.type == T.Comma || next.type == T.Semicolon || next.type == T.RParen)
+        {
+          ident = token.identifier;
+          nT();
+          break;
+        }
+        // fall through
+      default:
+        type = parseDeclarator(ident);
+      }
+
+      params ~= new Parameter(stc, type, ident, null);
+
+      if (token.type != T.Comma)
+        break;
+      nT();
+    }
+    require(T.Semicolon);
+    aggregate = parseExpression();
+    require(T.RParen);
+    auto forBody = parseScopeStatement();
+    return new ForeachStatement(tok, params, aggregate, forBody);
+  }
+
   /+++++++++++++++++++++++++++++
   + Expression parsing methods +
   +++++++++++++++++++++++++++++/
--- a/trunk/src/Statements.d	Sat Jul 14 09:01:05 2007 +0000
+++ b/trunk/src/Statements.d	Sat Jul 14 09:34:04 2007 +0000
@@ -5,6 +5,7 @@
 module Statements;
 import Expressions;
 import Types;
+import Token;
 
 class Statement
 {
@@ -99,6 +100,7 @@
   Statement init;
   Expression condition, increment;
   Statement forBody;
+
   this(Statement init, Expression condition, Expression increment, Statement forBody)
   {
     this.init = init;
@@ -110,7 +112,18 @@
 
 class ForeachStatement : Statement
 {
+  TOK tok;
+  Parameters params;
+  Expression aggregate;
+  Statement forBody;
 
+  this(TOK tok, Parameters params, Expression aggregate, Statement forBody)
+  {
+    this.tok = tok;
+    this.params = params;
+    this.aggregate = aggregate;
+    this.forBody = forBody;
+  }
 }
 
 class SwitchStatement : Statement