private void graficarAfnd() { string pathDesktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string pathFolder = pathDesktop + "\\ER_Analisis\\" + conteoAnalisis + "\\AFND"; try { if (!Directory.Exists(pathFolder)) { DirectoryInfo dir = Directory.CreateDirectory(pathFolder); } string pathRep = pathFolder + "\\AFND" + conteoAnalisis + +numEr + ".dot"; StreamWriter repAFND = new StreamWriter(pathRep); //Escribir el archivo dot repAFND.WriteLine("digraph AFND{"); repAFND.WriteLine("rankdir=LR;"); repAFND.WriteLine("size=\"13\";"); //Nodo de aceptacion int numEstados = afn.Count - 1; nodoThompson aceptacion = (nodoThompson)afn[numEstados]; repAFND.WriteLine(aceptacion.getEstado() + "[peripheries = 2, shape=circle];"); //Configuracion de los nodos repAFND.WriteLine("node[shape=circle, peripheries=1];"); repAFND.WriteLine("node[fontcolor=black];"); repAFND.WriteLine("edge[color=black];"); //Insertar nodos transicion foreach (nodoThompson item in afn) { foreach (nodoSiguientes next in item.getTransiciones()) { if (next.getDir() == 1) { repAFND.Write(next.getEstadoNext() + " -> " + item.getEstado() + "[label=\"" + next.getValor() + "\", dir=back];\n"); } else { repAFND.Write(item.getEstado() + " -> " + next.getEstadoNext() + "[label=\"" + next.getValor() + "\"];\n"); } } } repAFND.WriteLine("}"); repAFND.Close(); string pathPng = pathFolder + "\\AFND" + conteoAnalisis + numEr + ".png"; this.crearImagen(pathRep, pathPng); } catch (Exception e) { } }
//Arreglar el dato de conjunto private int crearCabeceras(string conjunto, int estados, nodoCabecera actualEstado) { string guiaNuevoEstado = ""; string[] stringNum = conjunto.Split(','); ArrayList numEstados = new ArrayList(); ArrayList valoresEvaluados = new ArrayList(); string valorActual = ""; char epsilon = (char)603; nodoThompson nodoAceptacionGuia = (nodoThompson)tablaAfnd[tablaAfnd.Count - 1]; //Console.WriteLine("Conjunto guia: " + conjunto); //Console.WriteLine("estados guia: " + stringNum.Length); //Pasar los estados a numero en arrayList foreach (string num in stringNum) { //Console.WriteLine("numero: " + num); numEstados.Add(Int32.Parse(num)); if (Int32.Parse(num) == nodoAceptacionGuia.getEstado()) { actualEstado.setAceptacion(true); } } int repetirFor = 2; int esConj = 0; while (repetirFor != 0) { repetirFor--; //Encontrar los estados a los que se puede ir por medio de las hojas foreach (int state in numEstados) { //Extraer el estado del afnd definido por el state nodoThompson auxAfnd = getEstadoAfnd(state); if (auxAfnd.getTransiciones() != null) { //Evaluar las transiciones no iguales a epsilon foreach (nodoSiguientes stateNext in auxAfnd.getTransiciones()) { //Si el valor es igual al que estoy evaluando if (valorActual.Equals(stateNext.getValor())) { //Concatenar el estado a la guia de estados guiaNuevoEstado += "," + stateNext.getEstadoNext().ToString(); } //Si el valor actual es nulo else if (valorActual.Equals("")) { //Verificar que aun no se haya evaluado if (valoresEvaluados.Contains(stateNext.getValor())) { //Si ya esta evaluado pasar al siguiente nodo } else { //Si no es igual a epsilon if (!epsilon.ToString().Equals(stateNext.getValor())) { //Asignar el valor evaluando valorActual = stateNext.getValor(); guiaNuevoEstado = stateNext.getEstadoNext().ToString(); valoresEvaluados.Add(valorActual); esConj = stateNext.getEsConj(); } } } //Si el valor es epsilon else { //Ignorar y continuar con los demas objetos } } } } if (!valorActual.Equals("")) { //Evaluar si existe el estado encontrado con el conjunto guia if (!existeEstadoAfd(guiaNuevoEstado)) { estados++; //Si no existe insertarlo en la cabecera tablaAfd.Add(new nodoCabecera("S" + estados.ToString(), guiaNuevoEstado, false)); //Insertar transiciones actualEstado.addTransicion("S" + estados.ToString(), valorActual, esConj); } else { //Insertar transiciones actualEstado.addTransicion(getEstadoAfdGuia(guiaNuevoEstado).getIdEstado(), valorActual, esConj); } repetirFor++; esConj = 0; } //Limpiar los valores valorActual = ""; guiaNuevoEstado = ""; } return(estados); }