private StatementNode ParseFor() { if (Peek(_index + 2).TokenId == TokenId.In || Peek(_index + 3).TokenId == TokenId.In) { ForeachStatement statement = new ForeachStatement(_curtok); Advance(); AssertAndAdvance(TokenId.LParen); if (_curtok.TokenId == TokenId.Var) Advance(); statement.VarName = _curtok.Data; AssertAndAdvance(TokenId.Ident); AssertAndAdvance(TokenId.In); statement.Collection = ParseExpression(); AssertAndAdvance(TokenId.RParen); ParseBlock(statement.BlockStatement); if (_curtok.TokenId == TokenId.Semi) Advance(); return statement; } else { ForStatement statement = new ForStatement(_curtok); Advance(); AssertAndAdvance(TokenId.LParen); if (_curtok.TokenId != TokenId.Semi) { statement.Init.Add(ParseExpression()); while (_curtok.TokenId == TokenId.Comma) { AssertAndAdvance(TokenId.Comma); statement.Init.Add(ParseExpression()); } } AssertAndAdvance(TokenId.Semi); statement.Test = ParseExpression(); AssertAndAdvance(TokenId.Semi); if (_curtok.TokenId != TokenId.RParen) { statement.Inc.Add(ParseExpression()); while (_curtok.TokenId == TokenId.Comma) { AssertAndAdvance(TokenId.Comma); statement.Inc.Add(ParseExpression()); } } AssertAndAdvance(TokenId.RParen); ParseBlock(statement.BlockStatement); if (_curtok.TokenId == TokenId.Semi) { Advance(); } return statement; } }