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; } }
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; } }
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); }
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); }