private ForNode For() throws SyntaxException {
        try {
            BlockNode init = null;
            ExpressionNode condition = null;
            BlockNode<ExpressionNode> step = new BlockNode<ExpressionNode>();

            Position pos = iterator.current().coordinates().starting();
            nextToken();
            LeftBracket();

            if (iterator.current().type().is(Token.Type.VAR)) {
                init = VariableDecl();
            } else if (iterator.current().type().is(Token.Type.FirstOfExpression)) {
                init = new BlockNode<ExpressionNode>();
                init.addChild(Expression());

                while (iterator.current().type().is(Token.Type.COMMA)) {
                    nextToken();
                    init.addChild(Expression());
                }
            }
            Semicolon();
            if (iterator.current().type().is(Token.Type.FirstOfExpression)) {
                condition = Expression();
            }
            Semicolon();
            if (iterator.current().type().is(Token.Type.FirstOfExpression)) {
                step.addChild(Expression());

                while (iterator.current().type().is(Token.Type.COMMA)) {
                    nextToken();
                    step.addChild(Expression());
                }
            }

            RightBracket();
            BlockNode<Statement> code = Code();

            return new ForNode(init, condition, step, code, pos);
        } catch(SyntaxException ex) {
            throw ex;
        } catch(Exception ex) {
            throw (NonAnalysisException)new NonAnalysisException(ex)
                    .initPosition(iterator.current().coordinates().starting())
                    .Log("ru.bmstu.iu9.compiler.syntax");
        }
    }