/// <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>() )); } }