Mercurial > projects > dil
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