예제 #1
0
        public void analizar_transiciones(LinkedList <Transicion> transiciones, String estadoAceptacion, LinkedList <String> simbolos, Nodo inicio_thompson, LinkedList <Transicion> conjuntosNuevo)
        {
            LinkedList <Transicion> listaAuxiliar = new LinkedList <Transicion>();

            //verificamos si hay que continuar con la recursion
            //MessageBox.Show("cantidad de conjuntos a analizar :"+conjuntosNuevo.Count);
            foreach (Transicion nueva in conjuntosNuevo)
            {
                // MessageBox.Show("ejecuto nueva transiciones");
                //por cada simbolo del sistema prMEocedemos a buscar sus nuevos conjuntos

                //
                //     MessageBox.Show("Cantidad de simbolos:"+ simbolos.Count);
                foreach (String simbolo in simbolos)
                {
                    String conjunto_nuevo = "";

                    String[] conjunto = nueva.conjunto.Split('°');


                    foreach (String elemento in conjunto)
                    {
                        //aqui aplico lor ir
                        //
                        //    MessageBox.Show("el elemento es: " + elemento + "\nEl simbolo es: " + simbolo);

                        /*     if (elemento.Equals(estadoAceptacion) && conjunto.Count()==1)
                         *   {
                         * //         MessageBox.Show("estamos validando estados de aceptacion");
                         *       conjunto_nuevo += estadoAceptacion + "°";
                         *   }*/
                        buscarNodo(inicio_thompson, elemento, simbolo);
                        Nodo ir = nodo_encontrado_de_la_busqueda;
                        //si ir no es nulo quiere decir que si hay transicion con epsilon y por lo tanto genera un conjunto
                        if (ir != null)
                        {
                            //vamos a buscar sus datos y los concatenamos al nuevo conjunto

                            //
                            //   MessageBox.Show("ir tiene: " + ir.valor + " Tiene retorno :" + ir.aplicaRetorno.ToString());
                            conjunto_nuevo += recorrer_obtener_conjunto(ir, inicio_thompson);



                            nodo_encontrado_de_la_busqueda = null;
                        }
                    }

                    //agrego el nuevo estado
                    if (!conjunto_nuevo.Equals(""))
                    {
                        conjunto_nuevo = conjunto_nuevo.Remove(conjunto_nuevo.Count() - 1, 1);
                        // pila.Clear();
                        //
                        // MessageBox.Show("estoy aqui mostrando posible conjunto nuevo:" + conjunto_nuevo);
                        buscarEstado(transiciones, conjunto_nuevo);
                        String estado = seencontroEstado;



                        if (estado.Equals(""))
                        {
                            seencontroEstado = "";
                            estado_AFD++;
                            char Estadoo_nuevvo = estado_AFD;


                            transiciones.ElementAt(index).getEstadosSiguientes().AddLast(Estadoo_nuevvo + "¬" + simbolo);
                            //pregunto si es un estado de aceptacion
                            //
                            //   MessageBox.Show("Es un estado de aceptacion?\n"+"Comparando conjunto"+conjunto_nuevo+" Estado de aceptacion es:"+estadoAceptacion);
                            Boolean esunestadodeaceptacion = false;
                            if (conjunto_nuevo.Contains(fin_devuelta.valor))
                            {
                                esunestadodeaceptacion = true;
                            }
                            //agregamos la nueva transiciones
                            listaAuxiliar.AddLast(new Transicion(Convert.ToString(Estadoo_nuevvo), conjunto_nuevo, esunestadodeaceptacion));

                            transiciones.AddLast(new Transicion(Convert.ToString(Estadoo_nuevvo), conjunto_nuevo, esunestadodeaceptacion));
                            //

                            //     MessageBox.Show("El estado es: " + Estadoo_nuevvo + "\n" + "El conjunto inicial es: " + conjunto_nuevo);


                            //aqui mando a ejecutar transiciones el metodo otra vez
                        }
                        else
                        {
                            // if (!conjunto_nuevo.Equals(estadoAceptacion) && !transiciones.ElementAt(index).conjunto.Equals(conjunto_nuevo)){
                            transiciones.ElementAt(index).getEstadosSiguientes().AddLast(estado + "¬" + simbolo);
                        }
                    }

                    pila.Clear();

                    //fin for
                }


                index++;
            }
            // MessageBox.Show("Cantidad de estados nuevos"+ listaAuxiliar.Count);
            if (listaAuxiliar.Count > 0)
            {
                analizar_transiciones(transiciones, estadoAceptacion, simbolos, inicio_thompson, listaAuxiliar);
            }
            else
            {
                return;
            }
        }
예제 #2
0
        public void generarAFND(Nodo raiz)
        {
            //   MessageBox.Show("El nodo eS:" +raiz.valor);
            if (raiz.valor.Equals("."))
            {
                Nodo izquierda_inicio_and = null;
                Nodo izquierda_fin_and    = null;

                Nodo derecha_inicio_and = null;
                Nodo derecha_fin_and    = null;


                generarAFND(raiz.hijos.ElementAt(hijoizquierdo));

                izquierda_inicio_and = inicio_devuelta;
                izquierda_fin_and    = fin_devuelta;
                //      MessageBox.Show("izquierda   " + izquierda_inicio_and.valor+ " - " + izquierda_fin_and.valor);


                generarAFND(raiz.hijos.ElementAt(hijoderecho));
                derecha_inicio_and = inicio_devuelta;
                derecha_fin_and    = fin_devuelta;
                //      MessageBox.Show("derecha  " + derecha_inicio_and.valor + " - " + derecha_fin_and.valor);

                //       MessageBox.Show("lado izquierdo: " + izquierda_inicio_and.valor + " - " + izquierda_fin_and.valor + "\nlado derecho: " + derecha_inicio_and.valor + " - " + derecha_fin_and.valor);

                concatenacion(izquierda_inicio_and, izquierda_fin_and, derecha_inicio_and, derecha_fin_and);
            }
            else if (raiz.valor.Equals("(or)"))
            {
                //hereda dos hijos
                Nodo izquierda_inicio = null;
                Nodo izquierda_fin    = null;

                Nodo derecha_inicio = null;
                Nodo derecha_fin    = null;

                generarAFND(raiz.hijos.ElementAt(hijoizquierdo));
                izquierda_inicio = inicio_devuelta;
                izquierda_fin    = fin_devuelta;
                //      MessageBox.Show("izquierda :  " + izquierda_inicio.valor + " - " + izquierda_fin.valor);

                generarAFND(raiz.hijos.ElementAt(hijoderecho));
                derecha_inicio = inicio_devuelta;
                derecha_fin    = fin_devuelta;
                //  MessageBox.Show("derecha   " + derecha_inicio.valor + " - " + derecha_fin.valor);

                //   MessageBox.Show("lado izquierdo: " + izquierda_inicio.valor + " - " + izquierda_fin.valor + "\nlado derecho: " + derecha_inicio.valor + " - " + derecha_fin.valor);

                union(izquierda_inicio, izquierda_fin, derecha_inicio, derecha_fin);
            }
            else if (raiz.valor.Equals("*"))
            {
                //hereda un hijo
                generarAFND(raiz.hijos.ElementAt(hijoizquierdo));
                //     MessageBox.Show("los datos en * son:    ->" + inicio_devuelta.valor + " -  " + fin_devuelta.valor);
                cerraduraasterisco(inicio_devuelta, fin_devuelta);
            }
            else if (raiz.valor.Equals("+"))
            {
                //hereda un hijo
                generarAFND(raiz.hijos.ElementAt(hijoizquierdo));

                //    MessageBox.Show("los datos en + son:    ->"+  inicio_devuelta.valor + " -  "+fin_devuelta.valor);
                cerradurapositiva(inicio_devuelta, fin_devuelta);
                //   MessageBox.Show("los datos despues en + son:    ->" + inicio_devuelta.valor + " -  " + fin_devuelta.valor);
            }
            else if (raiz.valor.Equals("?"))
            {
                //herada un hijo
                generarAFND(raiz.hijos.ElementAt(hijoizquierdo));

                //      MessageBox.Show("los datos antes en ? son:    ->" + inicio_devuelta.valor + " -  " + fin_devuelta.valor);
                cerradurapregunta(inicio_devuelta, fin_devuelta);
                //MessageBox.Show("los datos despues en ? son:    ->" + inicio_devuelta.valor + " -  " + fin_devuelta.valor);
            }
            else
            {
                //de una hoja
                //retornar un simbolo o epsilon
                simbolo(raiz.valor);
                // MessageBox.Show("los datos en simbolo son:    ->" + inicio_devuelta.valor + " -  " + fin_devuelta.valor);
                return;
            }
        }
예제 #3
0
        public String recorrer_obtener_conjunto(Nodo inicio_AFND, Nodo inicio_thompshon)
        {
            String conjunto = "";

            Nodo padreActual = inicio_AFND;


            Boolean recorrehijos = true;

            //
            // MessageBox.Show("Estamos aqui analizando \nEL nodo es:"+ padreActual.valor+ " tiene retorno : "+ padreActual.aplicaRetorno);

            if (padreActual.transicion.Equals("ε"))
            {
                //   MessageBox.Show("la pila contiene esto: "+ pila.Contains(padreActual.valor + "°"));

                recorrehijos = true;
            }
            else
            {
                //si ya no hay transiciones con epsilon me salgo
                recorrehijos = false;

                //   conjunto = "";
            }


            if (recorrehijos)
            {
                if (!pila.Contains(padreActual.valor + "°"))
                {
                    conjunto += padreActual.valor + "°";
                }

                foreach (Nodo hijo in padreActual.hijos)
                {
                    if (!padreActual.aplicaRetorno)
                    {
                        if (!pila.Contains(hijo.valor + "°"))
                        {
                            conjunto += hijo.valor + "°";
                            pila.AddLast(hijo.valor + "°");
                            conjunto += recorrer_obtener_conjunto(hijo, inicio_thompshon);
                        }
                    }
                    else
                    {
                        //si en dado caso hay que seguir buscando otra vez con epsilon en algun retorno
                        //
                        //    MessageBox.Show("ingresando  a buscarnodoAUX");
                        buscarNodoAux(inicio_thompshon, padreActual.nodo_retorno, "ε");
                        //
                        //       MessageBox.Show("EL padre actual es: " + padreActual.valor + "\n El nodo a buscar es:" + padreActual.nodo_retorno + "\nEL nodo encontrado es: " + nodo_encontrado_de_la_busqueda.valor);

                        conjunto += recorrer_obtener_conjunto(nodo_encontrado_de_la_busqueda, inicio_thompshon);
                        nodo_encontrado_de_la_busqueda = null;


                        //   MessageBox.Show("tengo que aplicar el retorno");
                        if (!pila.Contains(hijo.valor + "°"))
                        {
                            conjunto += padreActual.nodo_retorno + "°";
                            conjunto += hijo.valor + "°";

                            pila.AddLast(padreActual.nodo_retorno + "°");
                            pila.AddLast(hijo.valor + "°");

                            //este sigue con los otros hijos
                            conjunto += recorrer_obtener_conjunto(hijo, inicio_thompshon);
                        }
                    }
                }
            }

            return(conjunto);
        }
예제 #4
0
        public void thompson()
        {
            rutas_AFD.Clear();
            rutas_AFND.Clear();
            rutas_transiciones.Clear();
            //por cada expresion se grafica un arbol
            foreach (Tablas_de_informacion expression in Informacion_de_cadaID)
            {
                //si solo viene un dato
                if (expression.expresionEstructurdaenLista.Count == 1)
                {
                    Nodo padre = new Nodo(".");
                    Nodo hijo1 = new Nodo(expression.expresionEstructurdaenLista.ElementAt(i).Replace("|", "(or)"));
                    Nodo hijo2 = new Nodo("#");
                    //     MessageBox.Show("EL hijo 1 contiene :" + hijo1.valor);
                    padre.agregarHijo(hijo1);
                    padre.agregarHijo(hijo2);
                    formarArbol(hijo1, expression.expresionEstructurdaenLista);

                    /*grafica el arbol de a expresion*/
                    grafica.escribir_fichero_grafo(grafica.recorrer_arbolito(padre) + "\n label=\"" + expression.id + "\";\n", expression.id);
                    grafica.generar_Dot_grafo_svg(expression.id, expression.id);



                    //se procede a graficar

                    arbol_dot += "rankdir=LR; size = \"8,5\"\n";
                    arbol_dot += "node [shape = circle];\n";


                    generarAFND(hijo1);

                    //la grafica como tal del AFND
                    //   grafica.escribir_fichero_grafo(arbol_dot, expression.id + "_AFND");
                    ///    grafica.generar_Dot_grafo(expression.id + "_AFND");

                    expression.raiz_arbol_expresion = padre;
                    expression.raiz_thompson        = inicio_devuelta;
                    /*para ver el recorrido del arbol thompson*/
                    //   MessageBox.Show("la raiz es:" + inicio_devuelta.valor + "y el fin es :" + fin_devuelta.valor);
                    grafica.escribir_fichero_grafo("rankdir = LR; size = \"8,5\" \n" + "node [shape = doublecircle]; " + fin_devuelta.valor + "\n" + "node [shape = circle];\n" + grafica.recorrer_AFND(inicio_devuelta), expression.id + "_AFND");
                    grafica.generar_Dot_grafo_svg(expression.id + "_AFND", "C:\\AFNDS\\" + expression.id + "_AFND");
                    grafica.generar_Dot_grafo_png(expression.id + "_AFND", "C:\\AFNDS\\" + expression.id + "_AFND");
                    rutas_AFND.AddLast("C:\\AFNDS\\" + expression.id + "_AFND.jpg");


                    /*reccorido pulido*/
                    /*mandamos hacer analisis de transiciones*/
                    //tamamos lo simbolos que se analizaran en las cerraduras
                    LinkedList <String> objetos_analizar = new LinkedList <string>();
                    nodos_hoja(hijo1, objetos_analizar);
                    Console.WriteLine("\n\nOBJETOS DE ANALISIS EN LAS CERRADURAS");
                    int num = 0;
                    foreach (String objeto in objetos_analizar)
                    {
                        Console.WriteLine("No." + num + " objeto ->" + objeto);
                        num++;
                    }

                    Console.WriteLine(" ------------------- ");
                    //limpiamos la pila por seguridad
                    pila.Clear();

                    //creamos nuestra lista de transiciones
                    LinkedList <Transicion> transiciones = new LinkedList <Transicion>();

                    //usamos el metodo "recorrer_obtener_conjunto" para obtener el conjunto inicial y por ende el primer estado A
                    conjunto = recorrer_obtener_conjunto(inicio_devuelta, inicio_devuelta);
                    //    MessageBox.Show("EL estado inicial es:" + conjunto);
                    //limpiamos la cadena puesto que hay una coma de mas al final , por lo tanto se quita
                    conjunto = conjunto.Remove(conjunto.Count() - 1, 1);
                    Boolean esunestadodeaceptacion = false;
                    if (conjunto.Contains(fin_devuelta.valor))
                    {
                        esunestadodeaceptacion = true;
                    }

                    transiciones.AddLast(new Transicion("A", conjunto, esunestadodeaceptacion));
                    //      MessageBox.Show("El estado es: " + "A\n" + "El conjunto inicial es: " + conjunto);
                    //limpiamos puesto que vamos a recorrer nuevamente el arbol


                    pila.Clear();
                    estado_AFD = 'A';
                    //AQUI inicia el metodo para analizar los estados futuros asi como sus conjuntos
                    LinkedList <Transicion> listaAux = new LinkedList <Transicion>();
                    listaAux.AddLast(new Transicion(estado_AFD.ToString(), conjunto, esunestadodeaceptacion));
                    //  MessageBox.Show("vamos a iniciar");
                    analizar_transiciones(transiciones, fin_devuelta.valor, objetos_analizar, inicio_devuelta, listaAux);

                    //analisis de transiciones
                    /*para ver el recorrido del arbol*/
                    grafica.escribir_fichero_grafo(grafica.hacer_table_transiciones(transiciones), expression.id + "_TRANSICIONES");
                    grafica.generar_Dot_grafo_svg(expression.id + "_TRANSICIONES", "C:\\TRANS\\" + expression.id + "_TRANSICIONES");
                    grafica.generar_Dot_grafo_png(expression.id + "_TRANSICIONES", "C:\\TRANS\\" + expression.id + "_TRANSICIONES");
                    rutas_AFND.AddLast("C:\\TRANS\\" + expression.id + "_TRANSICIONES.jpg");



                    grafica.escribir_fichero_grafo(grafica.hacer_automata(transiciones), expression.id + "_AFD");
                    grafica.generar_Dot_grafo_svg(expression.id + "_AFD", "C:\\AFDS\\" + expression.id + "_AFD");
                    grafica.generar_Dot_grafo_png(expression.id + "_AFD", "C:\\AFDS\\" + expression.id + "_AFD");
                    rutas_AFND.AddLast("C:\\AFDS\\" + expression.id + "_AFD.jpg");


                    //hacemos el analisis de los lexemas
                    Analisis_lexemas analizar_lexemas = new Analisis_lexemas(lista_macros, lista_lexemas, transiciones, expression.id);
                    log         += analizar_lexemas.analizar_lexema() + "\n";
                    xml_tokens  += analizar_lexemas.salida_xml_tokens;
                    xml_errores += analizar_lexemas.salida_xml_errores;
                    //  MessageBox.Show("Esto es lo que hay en log \n" + log);
                    conjunto = "";
                }
                else
                {// si vienen mas
                    Nodo padre = new Nodo(".");
                    Nodo hijo1 = new Nodo(expression.expresionEstructurdaenLista.ElementAt(i).Replace("|", "(or)"));
                    Nodo hijo2 = new Nodo("#");
                    //     MessageBox.Show("EL hijo 1 contiene :" + hijo1.valor);
                    padre.agregarHijo(hijo1);
                    padre.agregarHijo(hijo2);
                    formarArbol(hijo1, expression.expresionEstructurdaenLista);

                    /*grafica el arbol de a expresion*/
                    grafica.escribir_fichero_grafo(grafica.recorrer_arbolito(padre) + "\n label=\"" + expression.id + "\";\n", expression.id);
                    grafica.generar_Dot_grafo_svg(expression.id, expression.id);



                    //se procede a graficar

                    arbol_dot += "rankdir=LR; size = \"8,5\"\n";
                    arbol_dot += "node [shape = circle];\n";

                    grafica.pila.Clear();
                    generarAFND(hijo1);

                    //la grafica como tal del AFND
                    //   grafica.escribir_fichero_grafo(arbol_dot, expression.id + "_AFND");
                    ///    grafica.generar_Dot_grafo(expression.id + "_AFND");

                    expression.raiz_arbol_expresion = padre;
                    expression.raiz_thompson        = inicio_devuelta;
                    /*para ver el recorrido del arbol thompson*/
                    //   MessageBox.Show("la raiz es:" + inicio_devuelta.valor + "y el fin es :" + fin_devuelta.valor);
                    grafica.escribir_fichero_grafo("rankdir = LR; size = \"8,5\" \n" + "node [shape = doublecircle]; " + fin_devuelta.valor + "\n" + "node [shape = circle];\n" + grafica.recorrer_AFND(inicio_devuelta) + "\nlabel=\"" + expression.id + "\"", expression.id + "_AFND");
                    //  grafica.escribir_fichero_grafo("rankdir = LR; size = \"8,5\" \n" + "node [shape = doublecircle]; " + fin_devuelta.valor + "\n" + "node [shape = circle];\n" + arbol_dot + "\nlabel=\"" + expression.id + "\"", expression.id + "_AFND");

                    grafica.generar_Dot_grafo_svg(expression.id + "_AFND", "C:\\AFNDS\\" + expression.id + "_AFND");
                    grafica.generar_Dot_grafo_png(expression.id + "_AFND", "C:\\AFNDS\\" + expression.id + "_AFND");
                    rutas_AFND.AddLast("C:\\AFNDS\\" + expression.id + "_AFND.jpg");


                    /*reccorido pulido*/
                    /*mandamos hacer analisis de transiciones*/
                    //tamamos lo simbolos que se analizaran en las cerraduras
                    LinkedList <String> objetos_analizar = new LinkedList <string>();
                    nodos_hoja(hijo1, objetos_analizar);
                    Console.WriteLine("\n\nOBJETOS DE ANALISIS EN LAS CERRADURAS");
                    int num = 0;
                    foreach (String objeto in objetos_analizar)
                    {
                        Console.WriteLine("No." + num + " objeto ->" + objeto);
                        num++;
                    }

                    Console.WriteLine(" ------------------- ");
                    //limpiamos la pila por seguridad
                    pila.Clear();

                    //creamos nuestra lista de transiciones
                    LinkedList <Transicion> transiciones = new LinkedList <Transicion>();
                    //
                    //          MessageBox.Show(inicio_devuelta.valor);
                    //usamos el metodo "recorrer_obtener_conjunto" para obtener el conjunto inicial y por ende el primer estado A
                    conjunto = recorrer_obtener_conjunto(inicio_devuelta, inicio_devuelta);
                    //
                    //        MessageBox.Show("EL estado inicial es:" + conjunto);
                    //limpiamos la cadena puesto que hay una coma de mas al final , por lo tanto se quita
                    //y tambiien verifacamos si no devuelva nada para la recuperacion del dato
                    if (conjunto.Equals(""))
                    {
                        conjunto += inicio_devuelta.valor + "°";
                    }
                    //                   MessageBox.Show("antes de remove: " + conjunto);
                    conjunto = conjunto.Remove(conjunto.Count() - 1, 1);

                    //                    MessageBox.Show("despues de remove: "+ conjunto);
                    Boolean esunestadodeaceptacion = false;
                    if (conjunto.Contains(fin_devuelta.valor))
                    {
                        esunestadodeaceptacion = true;
                    }

                    transiciones.AddLast(new Transicion("A", conjunto, esunestadodeaceptacion));
                    //
                    //        MessageBox.Show("El estado es: " + "A\n" + "El conjunto inicial es: " + conjunto);
                    //limpiamos puesto que vamos a recorrer nuevamente el arbol


                    pila.Clear();
                    estado_AFD = 'A';
                    //AQUI inicia el metodo para analizar los estados futuros asi como sus conjuntos
                    LinkedList <Transicion> listaAux = new LinkedList <Transicion>();
                    listaAux.AddLast(new Transicion(estado_AFD.ToString(), conjunto, esunestadodeaceptacion));
                    //
                    //        MessageBox.Show("vamos a iniciar");
                    analizar_transiciones(transiciones, fin_devuelta.valor, objetos_analizar, inicio_devuelta, listaAux);

                    //analisis de transiciones
                    /*para ver el recorrido del arbol*/
                    grafica.escribir_fichero_grafo(grafica.hacer_table_transiciones(transiciones) + "\nlabel=\"" + expression.id + "\"", expression.id + "_TRANSICIONES");
                    grafica.generar_Dot_grafo_svg(expression.id + "_TRANSICIONES", "C:\\TRANS\\" + expression.id + "_TRANSICIONES");
                    grafica.generar_Dot_grafo_png(expression.id + "_TRANSICIONES", "C:\\TRANS\\" + expression.id + "_TRANSICIONES");
                    rutas_transiciones.AddLast("C:\\TRANS\\" + expression.id + "_TRANSICIONES.jpg");



                    grafica.escribir_fichero_grafo(grafica.hacer_automata(transiciones) + "\nlabel=\"" + expression.id + "\"", expression.id + "_AFD");
                    grafica.generar_Dot_grafo_svg(expression.id + "_AFD", "C:\\AFDS\\" + expression.id + "_AFD");
                    grafica.generar_Dot_grafo_png(expression.id + "_AFD", "C:\\AFDS\\" + expression.id + "_AFD");
                    rutas_AFD.AddLast("C:\\AFDS\\" + expression.id + "_AFD.jpg");

                    //hacemos el analisis de los lexemas
                    Analisis_lexemas analizar_lexemas = new Analisis_lexemas(lista_macros, lista_lexemas, transiciones, expression.id);
                    log         += analizar_lexemas.analizar_lexema() + "\n";
                    xml_tokens  += analizar_lexemas.salida_xml_tokens;
                    xml_errores += analizar_lexemas.salida_xml_errores;
                    //  MessageBox.Show("Esto es lo que hay en log \n" + log);
                    conjunto = "";
                }

                //limpiamos nuestros operadores
                i                = 0;
                arbol_dot        = "";
                fin_devuelta     = null;
                inicio_devuelta  = null;
                seencontroEstado = "";
                nodo_encontrado_de_la_busqueda = null;

                estado = 0;
                pila.Clear();
                index = 0;
            }
            //aqui se genera la salida html que es la misma de la consola
            Reportes_HTML.Reporte_html generar_htmll = new Reportes_HTML.Reporte_html();
            generar_htmll.escribir_lexemas_salida(lista_lexemas);
            generar_htmll.mostrar_lexemas_salida();
            //generamos xml en la ruta relativa
            Reportes_XML.Reporte_XML generar_xmls = new Reportes_XML.Reporte_XML();
            generar_xmls.reporte_tokens_xml(xml_tokens);
            generar_xmls.reporte_tokens_errores(xml_errores);
        }