public void generarDOT_DesdeArchivo() {
        FileWriter archivoAutomata = null;
        PrintWriter pw = null;
        nombreAutomata = JOptionPane.showInputDialog("Por favor, indique el nombre del archivo DOT que describe al automata");
        this.nombreAutomata += ".dot";
        try {
            //archivoAutomata = new FileWriter("C:\\GraphViz\\bin\\generadosyF\\" + nombreAutomata); // una ruta alternativa
            archivoAutomata = new FileWriter("ArchivosDOT\\" + nombreAutomata);

            pw = new PrintWriter(archivoAutomata);

            String estadoInicial = obtenerEstadoInicial();
            pw.println("digraph finite_state_machine {");
            pw.println("rankdir=LR;");
            pw.println("node [shape = point ]; qi;");
            pw.print("node [shape = doublecircle];");

            System.out.println("digraph finite_state_machine {");
            System.out.println("rankdir=LR;");
            System.out.println("node [shape = point ]; qi;");
            System.out.println("node [shape = doublecircle];");

            ArrayList estadosFinales = obtenerEstadosFinales();
            for (int i = 0; i < estadosFinales.size(); i++) {
                pw.print((String) estadosFinales.get(i) + ";");
                System.out.println((String) estadosFinales.get(i) + ";");
            }
            pw.println();
            pw.println("node [shape = circle];");
            pw.println("qi -> " + estadoInicial + ";");

            System.out.println("node [shape = circle];");
            System.out.println("qi   ->" + estadoInicial + ";");

            for (int l = 0; l < automata.size(); l++) { //ciclo principal, recorre automata
                String[] transicionesEstado = automata.get(l).toString().split(":"); // toma la linea completa:   0:a;1:b;-:c;-:@;-  y la parte por :
                for (int j = 1; j < transicionesEstado.length; j++) {  // resulta un arreglo del siguiente modo: transicionesEstado = {"0" ,  "a;1"  ,  "b;-"  ,  "c;-" ,  "@;-"}
                    String fragmentoTransic = transicionesEstado[j]; // toma un elemento del arreglo que se geeró despues de split
                    if (!fragmentoTransic.contains("-")) {
                        // se quita ; y ahora cada elemento es del tipo:   a,1,5,6,9 ...  (se sabe que el primer elemento es el simbolo de transición y los siguientes son estados)
                        String[] simboloyEstados = fragmentoTransic.replace(";", ",").split(",");
                        for (int k = 1; k < simboloyEstados.length; k++) {
                            //q2 -> q3 [ label = "0" ]; 
                            pw.println(transicionesEstado[0].replace("*", "") + " -> " + simboloyEstados[k] + "[ label = \"" + simboloyEstados[0] + "\" ];");
                            System.out.println(transicionesEstado[0].replace("*", "") + " -> " + simboloyEstados[k] + "[ label = \"" + simboloyEstados[0] + "\" ];");
                        }
                    }
                }
            }
            pw.println("}");
            System.out.println("}");

        } catch (IOException ex) {
            Logger.getLogger(AFN.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if (null != archivoAutomata) {
                    archivoAutomata.close();
                    JOptionPane.showMessageDialog(null, "El archivo " + nombreAutomata + " se gener\u00f3 satisfactoriamente");
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }