Beispiel #1
0
        //ESTE METODO DEVUELVE UNA LISTA DE ESTADOS QUE HAY QUE MANDAR A CERRADURA
        private List <Estado> Mueve(List <Estado> estados, string terminal)
        {
            List <Estado> estadosAlcanzados = new List <Estado>();

            foreach (var actual in estados)
            {
                Transicion transicion = actual.GetTransicionDer();
                if (transicion != null &&
                    transicion.GetTransicionSimbolo().Equals(terminal) &&
                    !estadosAlcanzados.Contains(transicion.GetSegundo()))
                {
                    estadosAlcanzados.Add(transicion.GetSegundo());
                }
                transicion = actual.GetTransicionIzq();
                if (transicion != null &&
                    transicion.GetTransicionSimbolo().Equals(terminal) &&
                    !estadosAlcanzados.Contains(transicion.GetSegundo()))
                {
                    estadosAlcanzados.Add(transicion.GetSegundo());
                }
            }
            return(estadosAlcanzados);
        }
Beispiel #2
0
        private EstadoAFD Cerradura(List <Estado> estados)
        {
            Stack <Estado> pilaEstados = new Stack <Estado>();
            Estado         actual;
            //estado AFD
            List <Estado> listaEstados  = new List <Estado>();
            List <int>    numeroEstados = new List <int>();

            foreach (var estado in estados)
            {
                actual = estado;
                pilaEstados.Push(actual);
                numeroEstados.Add(estado.GetNoEstado());

                while (pilaEstados.Count > 0)
                {
                    actual = pilaEstados.Pop();
                    if (actual != null)
                    {
                        Transicion transicion = actual.GetTransicionDer();
                        if (transicion != null &&
                            transicion.GetTransicionSimbolo().Equals("epsilon") &&
                            !listaEstados.Contains(transicion.GetSegundo()))
                        {
                            listaEstados.Add(transicion.GetSegundo());
                            numeroEstados.Add(transicion.GetSegundo().GetNoEstado());
                            pilaEstados.Push(transicion.GetSegundo());
                        }
                        transicion = actual.GetTransicionIzq();
                        if (transicion != null &&
                            transicion.GetTransicionSimbolo().Equals("epsilon") &&
                            !listaEstados.Contains(transicion.GetSegundo()))
                        {
                            listaEstados.Add(transicion.GetSegundo());
                            numeroEstados.Add(transicion.GetSegundo().GetNoEstado());
                            pilaEstados.Push(transicion.GetSegundo());
                        }
                    }
                }
                listaEstados.Add(estado);
            }

            EstadoAFD estadoAFD = new EstadoAFD(nombreEstadoAFD++, numeroEstados, listaEstados);

            if (listaEstados.Contains(automataND.GetEstadoFinal()))
            {
                estadoAFD.SetTipoEstado(EstadoAFD.Tipo.FINAL);
            }
            else
            {
                estadoAFD.SetTipoEstado(EstadoAFD.Tipo.NORMAL);
            }
            //Console.WriteLine("PRUEBA ESTADOS POR " + "epsilon");
            //string alv = "";
            //foreach (Estado est in listaEstados)
            //{
            //    alv += est.GetNoEstado();
            //}

            return(estadoAFD);
        }
Beispiel #3
0
        public void EnOrder(Transicion transicion)
        {
            bool   repeticion = false;
            string textoAlt;

            if (transicion != null)
            {
                textoAlt = transicion.GetPrimero().GetNoEstado() + " -> " + transicion.GetSegundo().GetNoEstado() + "[label=\"" + transicion.GetTransicionSimbolo() + "\"]";

                if (text.Contains(textoAlt))
                {
                    repeticion = true;
                }
                else
                {
                    text += textoAlt;
                }
                EnOrder(transicion.GetSegundo().GetTransicionIzq());
                if (!repeticion)
                {
                    EnOrder(transicion.GetSegundo().GetTransicionDer());
                }
            }
        }