private bool elimEstMorto(ref Automato automato, ref Dictionary <string, bool> visitados, string estado) { bool ret = false; if (visitados.ContainsKey(estado)) { visitados.TryGetValue(estado, out ret); return(ret); } else { visitados.Add(estado, automato.estadosFinais.Contains(estado)); foreach (string s in automato.simbolos) { Transicao t = automato.GetTransicao(estado, s); foreach (string e2 in t.estado2) { if (elimEstMorto(ref automato, ref visitados, e2)) { ret = true; } } } } visitados.Remove(estado); visitados.Add(estado, ret | automato.estadosFinais.Contains(estado)); return(ret); }
//Gera os estados do Automato de acordo com a tabela posicao_seguinte no algoritmo Aho private Automato geraEstados(Automato automato, Stack <HashSet <int> > stack) { HashSet <int> estado1, estado2 = new HashSet <int>(); while (stack.Count() > 0) { estado1 = stack.Pop(); string nomeEstado1 = geraNomeDoEstado(estado1); estado2 = new HashSet <int>(); foreach (var simbol in arvore.simbolos.ToList()) { estado2 = new HashSet <int>(); foreach (var i in estado1.ToList()) { if ((string)arvore.folhas[i] == simbol) { if (arvore.posicao_seguinte.ContainsKey(i)) { estado2.UnionWith((HashSet <int>)arvore.posicao_seguinte[i]); } } } if (estado2.Count > 0) { string nomeEstado2 = geraNomeDoEstado(estado2); if (estado1.SetEquals(estado2)) { automato.addTransicao(nomeEstado1, simbol, nomeEstado1); } else { bool contemTransacao = false; var t = automato.GetTransicao(nomeEstado1, simbol); foreach (var e in t.estado2) { if (e == nomeEstado2) { contemTransacao = true; } } //foreach (var k in automato.transicoes.Keys) // if (k[0] == nomeEstado1 && k[1] == simbol) // contemTransacao = true; if (!contemTransacao) { if (!automato.estados.Contains(nomeEstado2)) { stack.Push(estado2); automato.addEstado(nomeEstado2); } automato.addTransicao(nomeEstado1, simbol, nomeEstado2); //estado2.Clear(); } } } } } return(automato); }
//Cria Transições para o novo Automato resultante das classes de equivalencia. private void criaTransicoes(HashSet <HashSet <string> > classes, Automato automato, Hashtable rel) { foreach (HashSet <string> classe in classes) { foreach (string e in classe) { foreach (string s in simbolos) { foreach (string e2 in automato.GetTransicao(e, s).estado2) { string origem = (string)rel[e]; string destino = (string)rel[e2]; addTransicao(origem, s, destino); } } break; } } }
public Automato eliminaEstadosInalcancaveis(Automato automato, Automato miniAuto, string estado) { foreach (string s in automato.simbolos) { HashSet <string> temp = automato.GetTransicao(estado, s).estado2; foreach (string e in temp) { bool exists = miniAuto.estados.Contains(e); if (!exists) { miniAuto.addEstado(e); } miniAuto.addTransicao(estado, s, e); if (!exists /*&& !miniAuto.estadoInicial.Contains(e)*/) { eliminaEstadosInalcancaveis(automato, miniAuto, e); } } } return(miniAuto); }