/// <summary>
        /// Recebe um Evento contendo um Token Lexico
        /// </summary>
        /// <param name="evento">Tipo: TOKEN_LEXICO, Conteudo: TokenLexico </param>
        /// <returns></returns>
        public SaidaRotina ReceberToken(Evento evento)
        {
            TokenLexico tokenLexico = (TokenLexico)evento.Conteudo;

            Transicao transicao = AutomatoFinito.BuscaTransicao(Cabecote.EstadoAtual, tokenLexico.Categoria);

            if (transicao != null)
            {
                Transicao(transicao);
                Acumulador.Add(tokenLexico);
                return(new SaidaRotina(
                           new List <Evento>(),
                           new List <Evento>(),
                           new List <Evento>()
                           ));
            }
            else
            {
                if (Cabecote.Aceito)
                {
                    return(new SaidaRotina(
                               new List <Evento>(),
                               new List <Evento>()
                    {
                        new Evento(evento.InstanteProgramado + 1, TipoEvento.RESET, evento.Tarefa, null), new Evento(evento.InstanteProgramado + 2, TipoEvento.TOKEN_LEXICO, evento.Tarefa, evento.Conteudo)
                    },
                               new List <Evento>()
                    {
                        new Evento(evento.InstanteProgramado + 1, TipoEvento.TOKEN_LEXICO, evento.Tarefa, GetTokenLexicoFromEstadoAtual())
                    }
                               ));
                }
                else
                {
                    List <Evento> eventosSaida = new List <Evento>();
                    eventosSaida.AddRange(Acumulador.Select(t => new Evento(evento.InstanteProgramado + 1, TipoEvento.TOKEN_LEXICO, evento.Tarefa, t)));
                    eventosSaida.Add(new Evento(evento.InstanteProgramado + 2, TipoEvento.TOKEN_LEXICO, evento.Tarefa, evento.Conteudo));

                    return(new SaidaRotina(
                               new List <Evento>(),
                               new List <Evento>()
                    {
                        new Evento(evento.InstanteProgramado + 1, TipoEvento.RESET, evento.Tarefa, null)
                    },
                               eventosSaida
                               ));
                }
            }
        }
        /// <summary>
        /// Recebe um Evento contendo uma CaracterCaracterizado
        /// </summary>
        /// <param name="evento">Tipo: ASCII, Conteudo: CaracterClassificado </param>
        /// <returns></returns>
        //  Token possui Tipo (Identificador, Número, Especial) e Valor
        public SaidaRotina ReceberCaracter(Evento evento)
        {
            CaracterClassificado caracterClassificado = (CaracterClassificado)evento.Conteudo;

            Transicao transicao = AutomatoFinito.BuscaTransicao(Cabecote.EstadoAtual, caracterClassificado.Caracter);

            if (transicao != null)
            {
                Transicao(transicao);
                if (caracterClassificado.Funcao != FuncaoCaracter.DESCARTAVEL)
                {
                    Acumulador.Add(caracterClassificado);
                }
                return(new SaidaRotina(
                           new List <Evento>(),
                           new List <Evento>(),
                           new List <Evento>()
                           ));
            }
            else if (caracterClassificado.Tipo == TipoCaracter.DELIMITADOR || Cabecote.Aceito)
            {
                return(new SaidaRotina(
                           new List <Evento>(),
                           new List <Evento>()
                {
                    new Evento(evento.InstanteProgramado + 1, TipoEvento.RESET, evento.Tarefa, null), new Evento(evento.InstanteProgramado + 2, TipoEvento.ASCII, evento.Tarefa, evento.Conteudo)
                },
                           new List <Evento>()
                {
                    new Evento(evento.InstanteProgramado + 1, TipoEvento.TOKEN_LEXICO, evento.Tarefa, GetTokenLexicoFromEstadoAtual())
                }
                           ));
            }
            else
            {
                TransicaoNA();
                Acumulador.Add(caracterClassificado);
                return(new SaidaRotina(
                           new List <Evento>(),
                           new List <Evento>(),
                           new List <Evento>()
                           ));
            }
        }