public Pair<String, File> parse() throws IOException {
        
        // opção de entrada
        Option input = OptionBuilder.withLongOpt("input").
                hasArgs().withArgName("lista de arquivos").
                withDescription("arquivos de entrada").
                create("i");
        
        // opção de saída
        Option output = OptionBuilder.withLongOpt("output").
                hasArg().withArgName("arquivo").
                withDescription("arquivo de saída").create("o");
        
        // opção do editor embutido
        Option ui = OptionBuilder.withLongOpt("editor").
                withDescription("editor gráfico").create("e");
        
        Options options = new Options();
        options.addOption(input);
        options.addOption(output);
        options.addOption(ui);
        
        try {
            
            // parsing dos argumentos
            Parser parser = new BasicParser();
            CommandLine line = parser.parse(options, arguments);
            
            // verifica se é uma chamada ao editor e retorna em caso positivo
            if (line.hasOption("e")) {
                editor = true;
                return null;
            }
            
            // se não é uma chamada ao editor de macros, é necessário verificar
            // se existe um arquivo de entrada
            if (!line.hasOption("i")) {
                throw new ParseException("");
            }
            
            // existem argumentos restantes, o que representa situação de erro
            if (!line.getArgList().isEmpty()) {
                throw new ParseException("");
            }
            
            String text = "";
            File out = line.hasOption("output") ?
                    new File(line.getOptionValue("output")) : null;
            
            if (out == null) {
                logger.info(
                        "A saída será gerada no terminal."
                );
            }
            else {
                logger.info(
                        "A saída será gerada no arquivo '{}'.",
                        out.getName()
                );
            }
            
            // faz a leitura de todos os arquivos e concatena seu conteúdo em
            // uma variável
            logger.info(
                    "Iniciando a leitura dos arquivos de entrada."
            );
            String[] files = line.getOptionValues("input");
            for (String file : files) {
                logger.info(
                        "Lendo arquivo '{}'.",
                        file
                );
                text = text.concat(FileUtils.readFileToString(
                        new File(file), Charset.forName("UTF-8"))
                );
            }
            
            // retorna o par da variável contendo o texto de todos os arquivos
            // e a referência ao arquivo de saída (podendo este ser nulo)
            return new Pair<>(text, out);
            
        }
        catch (ParseException exception) {
            
            // imprime a ajuda
            HelpFormatter help = new HelpFormatter();
            help.printHelp(
                    "expander ( --editor | --input <lista de arquivos>"
                            + " [ --output <arquivo> ] )",
                    options
            );
        }

        // retorna um valor inválido indicando para não prosseguir com o
        // processo de expansão
        return null;
        
    }