Beispiel #1
0
        /// <summary>
        /// ////////////////////////////////////////UNO O MAS  .a*a   //////////////////////////////////////////////////
        /// </summary>
        /// <param name="AFN1"></param>
        /// <returns></returns>
        public Automata Uno_mas(Automata AFN1, Automata AFN2)
        {
            Automata AFN_UNOMAS = new Automata();
            //// .a*a
            ///se crea un nuevo estado inicial
            /// se crea un automata para la cerradura de kleene
            int i = 0;

            for (i = 0; i < AFN1.getEstados().Count(); i++)
            {
                Estado tmp = (Estado)AFN1.getEstados().ElementAt(i);
                tmp.setId(i);
                if (i == 0)
                {
                    AFN_UNOMAS.setEstadoInicial(tmp);
                }
                if (i == AFN1.getEstados().Count() - 1)                // el ultimo estado se concatena con el de kleene
                {
                    // creando trancision de estado inicial kleeene y estado aceptacion de  afn1
                    for (int k = 0; k < AFN1.getEstadosAceptacion().Count(); k++)
                    {
                        Trancisiones tran = new Trancisiones();
                        tran.Transicion((Estado)AFN1.getEstadosAceptacion().ElementAt(k), AFN2.getEstadoInicial(), AnalizadorTexto.AnalizadorTexto.EPSILON);
                        tmp.setTransiciones(tran);
                    }
                    Estado nuevoInicio = tmp;
                    //agregar todos los estados intermedio

                    for (int j = 0; j < AFN2.getEstados().Count(); j++)
                    {
                        Estado tmpi = (Estado)AFN2.getEstados().ElementAt(j);
                        tmpi.setId(i + 1);
                        AFN_UNOMAS.addEstados(tmpi);
                        if (j == 0)
                        {
                            AFN2.getEstadoInicial().setId(i + 1);
                        }
                        if (AFN2.getEstados().Count() - 1 == j)
                        {
                            AFN2.getEstadosAceptacion().Clear();
                            Console.WriteLine(AFN2.getEstadosAceptacion().Count());
                            tmpi.getTransiciones().Clear();
                            AFN2.addEstadosAceptacion(tmpi);
                        }
                        i++;
                    }
                    //Se crea un nuevo estado de aceptacion
                    Estado nuevoFin = new Estado(i + 1);
                    AFN_UNOMAS.addEstados(nuevoFin);
                    AFN_UNOMAS.addEstadosAceptacion(nuevoFin);
                    //definir estados clave para realizar la cerraduras
                    Estado              anteriorInicio = AFN2.getEstadoInicial();
                    Trancisiones        rem            = anteriorInicio.getTransiciones().ElementAt(0);
                    LinkedList <Estado> anteriorFin    = AFN2.getEstadosAceptacion();
                    //Se agrega el dato de trancisiones de anteriorinicio y anteriorfin
                    String       simbolos    = rem.getSimbolo();
                    Trancisiones unionafinal = new Trancisiones();
                    unionafinal.Transicion(AFN2.getInicial(), anteriorFin.ElementAt(AFN2.getEstadosAceptacion().Count() - 1), simbolos);
                    anteriorInicio.setTransiciones(unionafinal);


                    // agregar transiciones desde el nuevo estado inicial
                    Trancisiones tran1 = new Trancisiones();
                    tran1.Transicion(nuevoInicio, anteriorInicio, AnalizadorTexto.AnalizadorTexto.EPSILON);
                    nuevoInicio.getTransiciones().AddLast(tran1);
                    Trancisiones tran21 = new Trancisiones();
                    tran21.Transicion(nuevoInicio, nuevoFin, AnalizadorTexto.AnalizadorTexto.EPSILON);
                    nuevoInicio.getTransiciones().AddLast(tran21);
                    // agregar transiciones desde el anterior estado final
                    for (int k = 0; k < anteriorFin.Count(); k++)
                    {
                        Trancisiones tran3 = new Trancisiones();
                        tran3.Transicion(anteriorFin.ElementAt(k), anteriorInicio, AnalizadorTexto.AnalizadorTexto.EPSILON);
                        anteriorFin.ElementAt(k).getTransiciones().AddLast(tran3);
                        Trancisiones tran4 = new Trancisiones();
                        tran4.Transicion(anteriorFin.ElementAt(k), nuevoFin, AnalizadorTexto.AnalizadorTexto.EPSILON);
                        anteriorFin.ElementAt(k).getTransiciones().AddLast(tran4);
                    }
                }
                AFN_UNOMAS.addEstados(tmp);
            }

            AFN_UNOMAS.setAlfabeto(AFN1.getAlfabeto());
            AFN_UNOMAS.setLenguajeR(AFN1.getLenguajeR());

            Hashtable temporal           = new Hashtable();
            LinkedList <Trancisiones> te = new LinkedList <Trancisiones>();
            Automata NUEVOCAMBIO         = new Automata();
            int      auxiliares          = 0;

            foreach (Estado estados in AFN_UNOMAS.getEstados())
            {
                Estado nuevos = new Estado(auxiliares);
                Console.WriteLine("idEstado  " + estados.getId() + "  cantidad de trancisiones    " + estados.getTransiciones().Count());
                NUEVOCAMBIO.addEstados(nuevos);
                auxiliares++;
            }
            foreach (Estado estados in AFN_UNOMAS.getEstados())
            {
                foreach (Trancisiones trancision in estados.getTransiciones())
                {
                    try
                    {
                        temporal.Add(trancision.getFin().getId() + "" + trancision.getInicio().getId(), estados.getId());

                        te.AddLast(trancision);
                        Console.WriteLine(trancision.getInicio().getId() + " ============ " + trancision.getFin().getId());
                        foreach (Estado state in NUEVOCAMBIO.getEstados())
                        {
                            if (trancision.getInicio().getId() == state.getId())
                            {
                                Trancisiones transi      = new Trancisiones();
                                Estado       iniciotran  = new Estado(trancision.getInicio().getId());
                                Estado       fintran     = new Estado(trancision.getFin().getId());
                                String       simbolotran = trancision.getSimbolo();
                                transi.Transicion(iniciotran, fintran, simbolotran);
                                state.getTransiciones().AddLast(transi);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("SE REPITE    " + trancision.getInicio().getId() + "  " + trancision.getFin().getId());
                    }
                }
            }


            Automata AFN_UNOOMAS = new Automata();

            /*foreach(Trancisiones auxiliar in te)
             * {
             *      Estado aux = new Estado(auxiliar.getInicio().getId());
             *      aux.setTransiciones(auxiliar);
             *      AFN_UNOOMAS.addEstados(aux);
             * }
             * ////borramos todas las trancisiones
             * AFN_UNOOMAS.addEstadosAceptacion(AFN_UNOMAS.getEstadosAceptacion().ElementAt(0));
             * AFN_UNOOMAS.setEstadoInicial(AFN_UNOMAS.getEstadoInicial());
             * AFN_UNOOMAS.setInicial(AFN_UNOMAS.getInicial());
             * AFN_UNOOMAS.setLenguajeR(AFN_UNOMAS.getLenguajeR());
             * AFN_UNOOMAS.setAlfabeto(AFN_UNOMAS.getAlfabeto());
             *
             * Automata TEMPORALES = new Automata();
             * int repetidos = 0;
             * foreach (Estado auxiliar in AFN_UNOMAS.getEstados())
             * {
             *      Estado anteriores = auxiliar;
             *      Estado nuevos = new Estado(anteriores.getId());
             *      TEMPORALES.addEstados(nuevos);
             *
             * }
             * foreach (Estado auxiliar in AFN_UNOOMAS.getEstados())
             * {
             *      foreach (Trancisiones transi in auxiliar.getTransiciones())
             *      {
             *              foreach (Estado entry in TEMPORALES.getEstados())
             *              {
             *                      if (auxiliar.getId() == entry.getId())
             *                      {
             *                              entry.setTransiciones(transi);
             *                              foreach(Trancisiones agregando in entry.getTransiciones())
             *                              {
             *                                      agregando.setInicio(transi.getInicio());
             *                                      agregando.setFin(transi.getFin());
             *                                      agregando.setSimbolo(transi.getSimbolo());
             *                              }
             *
             *                      }
             *                      repetidos++;
             *              }
             *      }
             * }
             *
             *
             */
            NUEVOCAMBIO.setTipo("AFN_UNOMAS");
            NUEVOCAMBIO.addEstadosAceptacion(AFN_UNOMAS.getEstadosAceptacion().ElementAt(0));
            NUEVOCAMBIO.setEstadoInicial(NUEVOCAMBIO.getEstados().ElementAt(0));
            NUEVOCAMBIO.setInicial(NUEVOCAMBIO.getEstados().ElementAt(0));
            NUEVOCAMBIO.setLenguajeR(AFN_UNOMAS.getLenguajeR());
            NUEVOCAMBIO.setAlfabeto(AFN_UNOMAS.getAlfabeto());


            return(NUEVOCAMBIO);
        }
        public Object minimizar(Automata automata)
        {
            numestados    = automata.getEstados().Count();
            alfabeto      = automata.getAlfabeto();
            estadoInicial = automata.getEstadoInicial().getId();
            estadoFinal   = automata.getEstadosAceptacion();
            int fila = 0, columna = 0;
            int contadorparatablanoString = 0;

            foreach (Object key in alfabeto.Keys)
            {
                if (key is System.Collections.Hashtable)
                {
                    contadorparatablanoString++;
                }
                else
                {
                    Console.WriteLine(key);
                }
            }
            tabtrans = new LinkedList <int> [numestados, alfabeto.Keys.Count - contadorparatablanoString];
            foreach (Estado state in automata.getEstados())
            {
                foreach (Object key in alfabeto.Keys)
                {
                    if (key is System.Collections.Hashtable)
                    {
                        contadorparatablanoString++;
                    }
                    else
                    {
                        LinkedList <int> auxiliar = new LinkedList <int>();
                        foreach (Trancisiones tran in state.getTransiciones())
                        {
                            if (tran.getSimbolo().Equals(key))
                            {
                                auxiliar.AddLast(tran.getFin().getId());
                            }
                        }
                        tabtrans[columna, fila] = auxiliar;
                        fila++;
                    }
                }


                fila = 0;
                columna++;
            }

            quitarTansicionesVacias(automata);
            //quitarIndeterminismo();

            /*while (!verificarMinimo())
             * {
             *  minimizar();
             * }*/
            //tabtrans = automata.get();
            Automata MINIMIZADO           = new Automata();
            int      contador             = 0;

            /*foreach (Estado state in automata.getEstados())
             * {
             *  Estado nuevoestado = state;
             *
             *  foreach (Trancisiones tran in state.getTransiciones())
             *  {
             *      nuevoestado.setTransiciones(tran);
             *  }
             *  MINIMIZADO.addEstados(nuevoestado);
             * }*/
            MINIMIZADO.addEstadosAceptacion(automata.getEstadosAceptacion().ElementAt(0));
            MINIMIZADO.setEstadoInicial(automata.getEstados().ElementAt(0));
            MINIMIZADO.setInicial(automata.getEstados().ElementAt(0));
            MINIMIZADO.setLenguajeR(automata.getLenguajeR());
            MINIMIZADO.setAlfabeto(alfabeto);

            return(new AFD_GRAFICA(MINIMIZADO, tabtrans));
        }
Beispiel #3
0
        public Automata Analizarentrada(LinkedList <DatoExpresion> Pila)
        {
            //// VAMOS A GUARDAR EL AFN EN UNA PILA
            Stack pilaAFN = new Stack();

            for (int i = Pila.Count() - 1; i >= 0; i--)
            {
                //Console.WriteLine(Pila.ElementAt(i).getLexema() + "   " + Pila.ElementAt(i).getTipo() + "   " + Pila.ElementAt(i).getIdgrafica());
                if (Pila.ElementAt(i).getLexema().Equals(".") && Pila.ElementAt(i).getTipo() == DatoExpresion.TipoExpresion.OPERADOR)
                {
                    Automata concat_izq       = (Automata)pilaAFN.Pop();
                    Automata concat_der       = (Automata)pilaAFN.Pop();
                    Automata concat_resultado = Concatenacion(concat_izq, concat_der);

                    pilaAFN.Push(concat_resultado);
                    this.afn = concat_resultado;
                }
                else if (Pila.ElementAt(i).getLexema().Equals("*") && Pila.ElementAt(i).getTipo() == DatoExpresion.TipoExpresion.OPERADOR)
                {
                    Automata kleene = CerraduraKleene((Automata)pilaAFN.Pop());
                    pilaAFN.Push(kleene);
                    this.afn = kleene;
                }
                else if (Pila.ElementAt(i).getLexema().Equals("?") && Pila.ElementAt(i).getTipo() == DatoExpresion.TipoExpresion.OPERADOR)
                {
                    Automata uno_epsilon = Uno_epsilon((Automata)pilaAFN.Pop());
                    pilaAFN.Push(uno_epsilon);
                    this.afn = uno_epsilon;
                }
                else if (Pila.ElementAt(i).getLexema().Equals("|") && Pila.ElementAt(i).getTipo() == DatoExpresion.TipoExpresion.OPERADOR)
                {
                    Automata union_izq       = (Automata)pilaAFN.Pop();
                    Automata union_der       = (Automata)pilaAFN.Pop();
                    Automata union_resultado = Disyuncion(union_izq, union_der);


                    pilaAFN.Push(union_resultado);
                    this.afn = union_resultado;
                }
                else if (Pila.ElementAt(i).getLexema().Equals("+") && Pila.ElementAt(i).getTipo() == DatoExpresion.TipoExpresion.OPERADOR)
                {
                    Automata elementosacado = (Automata)pilaAFN.Pop();

                    pilaAFN.Push(elementosacado);

                    Automata t = new Automata();
                    ///////////////////////////CLONAMOS NUESTRA VARIABLE PARA HACER EL DE KLEENE Y LA CONCATENACION
                    foreach (Estado sta in elementosacado.getEstados())
                    {
                        t.addEstados((Estado)sta.Clone());
                    }
                    foreach (Estado sta in elementosacado.getEstadosAceptacion())
                    {
                        t.addEstadosAceptacion((Estado)sta.Clone());
                    }
                    int a = 0;

                    t.setAlfabeto(elementosacado.getAlfabeto());
                    t.setLenguajeR((String)elementosacado.getLenguajeR().Clone());
                    t.setInicial((Estado)elementosacado.getInicial().Clone());
                    t.setEstadoInicial((Estado)elementosacado.getEstadoInicial().Clone());

                    ////////////////SE COMIENZA LA ACCION
                    Automata uno_mas = Uno_mas((Automata)pilaAFN.Pop(), t);
                    pilaAFN.Push(uno_mas);
                    this.afn = uno_mas;
                }
                else
                {
                    Automata simple = Simple(Pila.ElementAt(i).getLexema());
                    pilaAFN.Push(simple);
                    this.afn = simple;
                }
            }

            this.afn.createAlfabeto(Pila);
            this.afn.setTipo("AFN");
            Console.WriteLine(this.afn.DOT_THOMPSON(this.afn));
            return(afn);
        }