private BlockNode<Statement> Block() {
        BlockNode<Statement> block = new BlockNode<Statement>();


        while (iterator.current().type().is(
            new Token.Type[] {
                Token.Type.FirstOfControlStructure, 
                Token.Type.FirstOfExpression,
                Token.Type.VAR
        })) {
            try {
                if (iterator.current().type().is(
                    new Token.Type[] {
                        Token.Type.FirstOfControlStructure, 
                        Token.Type.VAR
                    })
                ) {
                    switch (iterator.current().type()) {
                        case FOR:
                            block.addChild(For());
                            break;
                        case IF:
                            block.addChild(If());
                            break;
                        case WHILE:
                            block.addChild(While());
                            break;
                        case DO:
                            block.addChild(DoWhile());
                            Semicolon();
                            break;
                        case RUN:
                            block.addChild(NewThread());
                            Semicolon();
                            break;
                        case SWITCH:
                            block.addChild(Switch());
                            break;
                        case RETURN:
                            block.addChild(Return());
                            Semicolon();
                            break;
                        case CONTINUE:
                            block.addChild(Continue());
                            Semicolon();
                            break;
                        case LOCK:
                            block.addChild(Lock());
                            break;
                        case BARRIER:
                            block.addChild(Barrier());
                            Semicolon();
                            break;
                        case BREAK:
                            block.addChild(Break());
                            Semicolon();
                            break;
                        case VAR:
                            block.addChild(VariableDecl());
                            Semicolon();
                            break;
                    }
                } else if(iterator.current().type().is(Token.Type.FirstOfExpression)) {
                    block.addChild(Expression());
                    Semicolon();
                }
            } catch(SyntaxException ex) {
                continue;
            }
        }

        return block;
    }