예제 #1
0
        public SubAFN crearOr(SubAFN basico1, SubAFN basico2)
        {
            SubAFN b1      = nuevo(basico1);
            SubAFN b2      = nuevo(basico2);
            SubAFN or      = new SubAFN();
            Estado inicial = new Estado(0);

            inicial.setTransicion(new TransicionThompson(inicial, b1.getInicial(), "ε"));
            inicial.setTransicion(new TransicionThompson(inicial, b2.getInicial(), "ε"));
            or.setEstado(inicial);
            or.setInicial(inicial);
            int e          = 0;
            int basico1tam = b1.getEstados().Count;
            int basico2tam = b2.getEstados().Count;

            for (e = 0; e < basico1tam; e++)
            {
                Estado aux = b1.getEstado(e);
                aux.setId(e + 1);
                foreach (TransicionThompson t in aux.getTransiciones())
                {
                    t.getInicio().setId(e + 1);
                    t.getFinal().setId(t.getFinal().getId() + 1);
                }
                or.setEstado(aux);
            }
            int tf = e + 1;

            for (int i = 0; i < basico2tam; i++)
            {
                Estado aux = b2.getEstado(i);
                aux.setId(e + 1);
                foreach (TransicionThompson t in aux.getTransiciones())
                {
                    t.getInicio().setId(e + 1);
                    t.getFinal().setId(t.getFinal().getId() + tf);
                }
                or.setEstado(aux);
                e++;
            }
            Estado final = new Estado(basico1tam + basico2tam + 1);

            or.setFinal(final);
            or.setEstado(final);
            Estado basico1fin = b1.getFinal();
            Estado basico2fin = b2.getFinal();

            basico1fin.setTransicion(new TransicionThompson(basico1fin, final, "ε"));
            basico2fin.setTransicion(new TransicionThompson(basico2fin, final, "ε"));
            return(or);
        }
예제 #2
0
        public SubAFN crearConcatenacion(SubAFN basico1, SubAFN basico2)
        {
            SubAFN conc2         = nuevo(basico2);
            SubAFN concatenacion = new SubAFN();
            int    e             = 0;

            for (e = 0; e < basico1.getEstados().Count - 1; e++)
            {
                Estado aux = basico1.getEstado(e);
                aux.setId(e);
                if (e == 0)
                {
                    concatenacion.setInicial(aux);
                }
                concatenacion.setEstado(aux);
            }
            int tf = e - conc2.getEstado(0).getId();

            for (int i = 0; i < conc2.getEstados().Count; i++)
            {
                Estado aux = conc2.getEstado(i);
                aux.setId(e);
                foreach (TransicionThompson t in aux.getTransiciones())
                {
                    t.getInicio().setId(e);
                    t.getFinal().setId(t.getFinal().getId() + tf);
                }
                if (i == conc2.getEstados().Count - 1)
                {
                    concatenacion.setFinal(aux);
                }
                concatenacion.setEstado(aux);
                e++;
            }
            return(concatenacion);
        }
예제 #3
0
        public void crearTransiciones(SubAFN afn, Stack <object[]> simbolos)
        {
            EstadoAFD nuevo = new EstadoAFD(0);

            nuevo.setCerradura(0);
            estados.Add(nuevo);
            for (int e = 0; e < estados.Count; e++)
            {
                for (int i = 0; i < estados[e].getCerraduras().Count; i++)
                {
                    Estado est = afn.getEstado(estados[e].getCerradura(i)); //entra al estado que indica la cerradura
                    if (estados[e].getCerradura(i) == afn.getFinal().getId())
                    {
                        estados[e].setAcepta();
                    }
                    foreach (TransicionThompson t in est.getTransiciones())
                    {
                        if (t.getLexema().Equals("ε") && !estados[e].encontrarC(t.getFinal().getId()))
                        {
                            estados[e].setCerradura(t.getFinal().getId());
                            if (t.getFinal().getId().Equals(afn.getFinal().getId()))
                            {
                                estados[e].setAcepta();
                            }
                        }
                        else if (!t.getLexema().Equals("ε"))
                        {
                            int m = encontrarMovimiento(t.getLexema(), estados[e]);
                            if (m == estados[e].getMovimiento().Count) //si el mover con dicho simbolo no existe
                            {
                                Movimiento mov = new Movimiento(t.getLexema(), encontrarSimbolo(simbolos, t.getLexema()));
                                mov.getMov().setCerradura(t.getFinal().getId());
                                mov.setMove(t.getFinal().getId());
                                estados[e].setMovimiento(mov);
                            }
                            else // si ya existe, se agrega a que otro estado se puede mover con la misma letra
                            {
                                estados[e].getMov(m).getMov().setCerradura(t.getFinal().getId());
                                estados[e].getMov(m).setMove(t.getFinal().getId());
                                estados[e].getMov(m).getMov().getCerraduras().Sort();
                            }
                        }
                    }
                }
                estados[e].getCerraduras().Sort();
                int edo = encontrarEstado(estados[e].getCerraduras(), e);
                if (edo != e)
                {
                    estados.RemoveAt(e);
                    e--;
                }
                else
                {
                    for (int t = 0; t < estados[e].getMovimiento().Count; t++)
                    {
                        int m = encontrarMovEstado(estados[e].getMov(t).getMoves(), e);
                        if (m != -1)
                        {
                            estados[e].getMov(t).getMov().setId(m);
                        }
                        else
                        {
                            EstadoAFD n = estados[e].getMov(t).getMov();
                            n.setId(estados.Count);
                            estados.Add(n);
                        }
                    }
                }
            }
        }