private IfNode If() throws SyntaxException {
        try {
            Position pos = iterator.current().coordinates().starting();
            nextToken();


            LeftBracket();
            ExpressionNode expr = Expression();
            RightBracket();

            BlockNode<Statement> block = Code();
            ElseNode elseNode = null;

            if (iterator.current().type().is(Token.Type.ELSE)) {
                Position elsepos = iterator.current().coordinates().starting();
                nextToken();

                if (iterator.current().type().is(Token.Type.IF)) {
                    elseNode =
                        new ElseNode(new BlockNode<Statement>(If()), elsepos);
                } else {
                    BlockNode<Statement> code = Code();
                    elseNode = new ElseNode(code, elsepos);
                }
            }
            return new IfNode(expr, block, elseNode, 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");
        }
    }