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

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

            LeftBrace();
            BlockNode<CaseNode> cases = new BlockNode<CaseNode>(Case());

            while (iterator.current().type().is(Token.Type.CASE)) {
                cases.addChild(Case());
            }
            DefaultNode defaultNode = null;
            if (iterator.current().type().is(Token.Type.DEFAULT)) {
                Position dpos = iterator.current().coordinates().starting();
                defaultNode = new DefaultNode(Default(), dpos);
            }
            RightBrace();

            return new SwitchNode(expr, cases, defaultNode, 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");
        }
    }