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; }
/* * @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; } }
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; }
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; }
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; }
/*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; } }
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); }