Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        //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);
        }
Exemplo n.º 3
0
 //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;
         }
     }
 }
Exemplo n.º 4
0
        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);
        }