public void graphAFD() { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Filter = "Archivo DOT (*.dot)|*.dot"; saveFile.DefaultExt = "dot"; saveFile.AddExtension = true; saveFile.Title = "Guardar AFD"; if (saveFile.ShowDialog() == DialogResult.OK) { FileStream MyStream = new FileStream(saveFile.FileName, FileMode.Create, FileAccess.Write, FileShare.None); StreamWriter MyWriter = new StreamWriter(MyStream); MyWriter.WriteLine("digraph G {\n nodesep=0.3;\n ranksep=0.2;\n margin=0.1;\n node [shape=circle];\n edge [arrowsize=0.8];\n"); MyWriter.WriteLine("rankdir = LR;\n"); foreach (Estado TempEstado in EstadosAFD) { if (TempEstado.getAceptacion()) { MyWriter.WriteLine(TempEstado.getID() + "[shape=doublecircle];\n"); } foreach (Transicion TempTransicion in TempEstado.getTransiciones()) { //FORMA a -> b [label="TerminalString"]; MyWriter.WriteLine(TempEstado.getID() + "->" + TempTransicion.getDestino().getID() + " [label=\"" + TempTransicion.getTerminalAFD() + "\"];\n"); } } MyWriter.WriteLine("}"); MyWriter.Close(); MyStream.Close(); MessageBox.Show("AFD Guardado Correctamente", "Grafico", MessageBoxButtons.OK, MessageBoxIcon.Information); //SE MANDO COMANDO AL SHELL DEL SISTEMA String RutaImg = Path.GetDirectoryName(saveFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(saveFile.FileName); String Command = "dot.exe -Tpng " + saveFile.FileName + " -o " + RutaImg + ".png"; Program.RutasAFD.AddLast(RutaImg + ".png"); Process cmd = new Process(); cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = false; cmd.StartInfo.UseShellExecute = false; cmd.Start(); cmd.StandardInput.WriteLine(Command); cmd.StandardInput.Flush(); cmd.StandardInput.Close(); cmd.WaitForExit(); Console.WriteLine(cmd.StandardOutput.ReadToEnd()); Console.Read(); } }
//REGRESA -1 SI NO HAY TRANSICION , DE NO SER ASI REGRESA ID DEL ESTADO DESTINO public int testChar(String arg1, LinkedList <Nodo> ListaNodos, LinkedList <Estado> Estados) { Nodo TempNodo; Estado TempEstado; int EstadoID = 0; int Largo; int TransicionesSize = this.ListaTransiciones.Count; String Lexema; Boolean Validacion; Transicion TempTransicion; //BUSCA SI EXISTE UNA TRANSICION PARA EL LEXEMA for (int i = 0; i < TransicionesSize; i++) { //SE OBTIENE LA TRANSICION i DEL ESTADO ACTUAL TempEstado = Estados.ElementAt(EstadoID); TempTransicion = TempEstado.getTransiciones().ElementAt(i); //OBTIENE NODO TERMINAL DE LA TRANSICION TempNodo = TempEstado.getNodoTerminal(ListaNodos, TempTransicion.getIDTerminal()); //VERIFICAR SI VA VALIDAR UN TERMINAL O CONJUNTO if (TempNodo.getConjunto() == null) { //SI SE VALIDA UN TERMINAL VALIDAR CUANTOS CARACTERES NECESITA Largo = TempNodo.getTerminal().Length; if (Largo > 1) { //SE VALIDA QUE HAYA LA CANTIDAD DE CARACTERES REQUERIDOS if (Largo <= arg1.Length) { Lexema = arg1.Substring(0, Largo); } else { //SI NO RETORNAR ESTADO ID -1 return(-1); } } else { Lexema = Char.ToString(arg1[0]); } } else { //SI NO VALIDAR UN SOLO CARACTER Lexema = Char.ToString(arg1[0]); } //SE VALIDA EN EL NODO TERMINAL DE LA TRANSICION Validacion = TempNodo.testChar(Lexema); //SI LA TRANSICION LO ACEPTA , ACTUALIZAR NODO,TRANSICIONES Y Lexema if (Validacion) { i = -1; EstadoID = TempTransicion.getDestino().getID(); TransicionesSize = Estados.ElementAt(EstadoID).getTransiciones().Count; //SE VERIFICA SI LA CADENA QUEDARA VACIA if (Lexema.Length == arg1.Length) { return(EstadoID); } //SI SE ACEPTO UNA CADENA else if (Lexema.Length > 1) { arg1 = arg1.Substring(Lexema.Length, arg1.Length); } //SI SE VALIDO UN CARACTER else { arg1 = arg1.Substring(1, arg1.Length); } } //SI NO SEGUIR ITERANDO EN LA TRANSICIONES } //NO EXISTE TRANSICION EN EL ESTADO PARA EL LEXEMA if (arg1.Length != 0) { return(-1); } return(EstadoID); }