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)); }