Esempio n. 1
0
        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;
            }
        }