Ejemplo n.º 1
0
        private AstItem ReadForLoop(TokenIterator tokens)
        {
            //for i in 0..5 [inc 1] {...}
            tokens.PopExpected(TokenKind.For);
            var varName = tokens.PopExpected(TokenKind.Word);

            tokens.PopExpected(TokenKind.In);
            var startExpression = ReadExpression(tokens, TokenKind.To);

            tokens.PopExpected(TokenKind.To);
            var endExpression = ReadExpression(tokens, new List <TokenKind>()
            {
                TokenKind.CurlyBracketOpen, TokenKind.Inc
            });

            var next = tokens.Pop();

            AstItem incExpression = AstItem.Immediate("1");

            if (next.Kind == TokenKind.Inc)
            {
                incExpression = ReadExpression(tokens, TokenKind.CurlyBracketOpen);
                tokens.PopExpected(TokenKind.CurlyBracketOpen);
            }
            else
            {
                Assert.True(next.Kind == TokenKind.CurlyBracketOpen, "Expected 'inc' or '{', got: " + next);
            }

            var statements = ReadStatements(tokens);

            tokens.PopExpected(TokenKind.CurlyBracketClose);
            return(AstItem.ForLoop(varName.Value, startExpression, endExpression, incExpression, statements));
        }