示例#1
0
        public void cerradurapregunta(Nodo inicio1aux, Nodo fin1aux)
        {
            Nodo inicio1 = inicio1aux;
            Nodo fin1    = fin1aux;


            fin1.transicion = "ε";
            //inicio2->inicio1
            Nodo Inicio2 = new Nodo(estado.ToString()); estado++;

            Inicio2.transicion = "ε";
            Inicio2.agregarHijo(inicio1);
            arbol_dot += Inicio2.valor + "->" + inicio1.valor;
            arbol_dot += "[label= \"" + Inicio2.transicion + "\"]\n";


            //fin1 -> fin2
            Nodo fin2 = new Nodo(estado.ToString()); estado++;

            fin2.transicion = "ε";
            fin1.agregarHijo(fin2);
            arbol_dot += fin1.valor + "->" + fin2.valor;
            arbol_dot += "[label= \"" + "ε" + "\"]\n";

            //inicio2-> fin2
            Inicio2.agregarHijo(fin2);

            arbol_dot += Inicio2.valor + "->" + fin2.valor;
            arbol_dot += "[label= \"" + Inicio2.transicion + "\"]\n";

            inicio_devuelta = Inicio2;
            fin_devuelta    = fin2;
        }
示例#2
0
        /*
         * @formarArbol
         *
         * este metodo permite formar un arbol de lo que se obtiene de la cadena
         * de la expresion regular
         *
         */
        public void formarArbol(Nodo padre, LinkedList <String> elemento)
        {
            if (i < elemento.Count)
            {
                //    MessageBox.Show("el elemento " + i + "es:" + elemento.ElementAt(i));


                if (elemento.ElementAt(i).Equals(".") || elemento.ElementAt(i).Equals("|"))
                {
                    i++;
                    String simbolo = elemento.ElementAt(i).Replace("|", "(or)");
                    simbolo = simbolo.Replace("<", "menorque");
                    simbolo = simbolo.Replace(">", "mayorque");
                    Nodo hijo1 = new Nodo(elemento.ElementAt(i).Replace("|", "(or)"));
                    padre.agregarHijo(hijo1);
                    formarArbol(hijo1, elemento);
                    i++;
                    simbolo = elemento.ElementAt(i).Replace("|", "(or)");
                    simbolo = simbolo.Replace("<", "menorque");
                    simbolo = simbolo.Replace(">", "mayorque");
                    Nodo hijo2 = new Nodo(simbolo);
                    padre.agregarHijo(hijo2);
                    formarArbol(hijo2, elemento);
                }
                else if (elemento.ElementAt(i).Equals("*") || elemento.ElementAt(i).Equals("?") || elemento.ElementAt(i).Equals("+"))
                {
                    i++;
                    String simbolo = elemento.ElementAt(i).Replace("|", "(or)");
                    simbolo = simbolo.Replace("<", "menorque");
                    simbolo = simbolo.Replace(">", "mayorque");

                    Nodo hijo1 = new Nodo(simbolo);

                    padre.agregarHijo(hijo1);

                    formarArbol(hijo1, elemento);
                }
                else
                {
                    //  Nodo hijo1 = new Nodo("", elemento.get(i).replace("|", "(or)"), "", "", "");
                    // padre.agregarHijo(hijo1);
                    return;
                }
            }
            else
            {
                return;
            }
        }
示例#3
0
        public void union(Nodo inicio1aux, Nodo fin1aux, Nodo inicio2aux, Nodo fin2aux)
        {
            Nodo inicio1 = inicio1aux;
            Nodo fin1    = fin1aux;

            Nodo inicio2 = inicio2aux;
            Nodo fin2    = fin2aux;


            Nodo inicio_or = new Nodo(estado.ToString()); estado++;

            inicio_or.transicion = "ε";

            inicio_or.agregarHijo(inicio1);
            inicio_or.agregarHijo(inicio2);

            arbol_dot += inicio_or.valor + "->" + inicio1.valor;
            arbol_dot += "[label= \"" + inicio_or.transicion + "\"]\n";

            arbol_dot += inicio_or.valor + "->" + inicio2.valor;
            arbol_dot += "[label= \"" + inicio_or.transicion + "\"]\n";

            Nodo fin_or = new Nodo(estado.ToString()); estado++;

            //     MessageBox.Show("mostrando si tiene retorno: "+ "este: "+fin1.valor+" tiene:" +fin1.aplicaRetorno.ToString());

            fin1.agregarHijo(fin_or);
            fin1.transicion = "ε";
            fin2.agregarHijo(fin_or);
            //      MessageBox.Show("mostrando si tiene retorno: " + "este: " + fin2.valor + " tiene:" + fin2.aplicaRetorno.ToString());
            fin2.transicion = "ε";

            arbol_dot += fin1.valor + "->" + fin_or.valor;
            arbol_dot += "[label= \"" + fin1.transicion + "\"]\n";

            arbol_dot += fin2.valor + "->" + fin_or.valor;
            arbol_dot += "[label= \"" + fin2.transicion + "\"]\n";



            //nuevos
            inicio_devuelta = inicio_or;
            fin_devuelta    = fin_or;
        }
示例#4
0
        public void cerraduraasterisco(Nodo inicio1aux, Nodo fin1aux)
        {
            Nodo inicio1 = inicio1aux;

            Nodo fin1 = fin1aux;

            //   MessageBox.Show("aplicando retorno a "+fin1.valor);
            fin1.aplicaRetorno = true;
            fin1.nodo_retorno  = inicio1.valor;
            //inicio2->inicio1
            Nodo Inicio2 = new Nodo(estado.ToString()); estado++;

            Inicio2.transicion = "ε";
            Inicio2.agregarHijo(inicio1);
            arbol_dot += Inicio2.valor + "->" + inicio1.valor;
            arbol_dot += "[label= \"" + Inicio2.transicion + "\"]\n";

            //fin1 -> inicio1

            fin1.transicion = "ε";
            arbol_dot      += fin1.valor + "->" + inicio1.valor;
            arbol_dot      += "[label= \"" + fin1.transicion + "\"]\n";

            //fin1 -> fin2
            Nodo fin2 = new Nodo(estado.ToString()); estado++;

            fin2.transicion = "ε";
            fin1.agregarHijo(fin2);
            //     fin1.agregarHijo(inicio1);
            arbol_dot += fin1.valor + "->" + fin2.valor;
            arbol_dot += "[label= \"" + "ε" + "\"]\n";

            //inicio2-> fin2
            Inicio2.agregarHijo(fin2);
            arbol_dot += Inicio2.valor + "->" + fin2.valor;
            arbol_dot += "[label= \"" + Inicio2.transicion + "\"]\n";

            inicio_devuelta = Inicio2;
            fin_devuelta    = fin2;
        }
示例#5
0
        public void concatenacion(Nodo inicio1aux, Nodo fin1aux, Nodo inicio2aux, Nodo fin2aux)
        {
            Nodo inicio1 = inicio1aux;
            Nodo fin1    = fin1aux;
            Nodo inicio2 = inicio2aux;
            Nodo fin2    = fin2aux;

            fin1.transicion = "ε";
            fin1.agregarHijo(inicio2);


            arbol_dot += fin1.valor + "->" + inicio2.valor;
            // fin1.agregarHijo(inicio2);
            arbol_dot += "[label= \"" + "ε" + "\"]\n";


            //nuevos
            inicio_devuelta = inicio1;
            fin_devuelta    = fin2;
        }
示例#6
0
        /*VAMOS A INCLUIR METODOS PARA AGREGAR SOLAMENTE LOS BLOQUES SEGUN LA CERRADURA*/


        public void simbolo(String simbolo)
        {
            if (simbolo.Equals("ε"))
            {
                //          MessageBox.Show("Encontre epsilon");
                Nodo inicio = new Nodo(estado.ToString()); estado++;
                inicio.transicion = "epsilon";


                Nodo fin = new Nodo(estado.ToString()); estado++;
                fin.transicion = simbolo;
                arbol_dot     += inicio.valor + "->" + fin.valor;
                arbol_dot     += "[label= \"" + inicio.transicion + "\"]\n";
                //inicio-> fin
                inicio.agregarHijo(fin);


                inicio_devuelta = inicio;
                fin_devuelta    = fin;
            }
            else
            {
                Nodo inicio = new Nodo(estado.ToString()); estado++;
                inicio.transicion = simbolo;


                Nodo fin = new Nodo(estado.ToString()); estado++;
                fin.transicion = "ε";
                arbol_dot     += inicio.valor + "->" + fin.valor;
                arbol_dot     += "[label= \"" + inicio.transicion + "\"]\n";
                //inicio-> fin
                inicio.agregarHijo(fin);


                inicio_devuelta = inicio;
                fin_devuelta    = fin;
            }
        }
示例#7
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);
        }