diff --git a/ejemplos/FirstLetterEqual(1).xml b/ejemplos/FirstLetterEqual(1).xml new file mode 100644 index 0000000..5ba9a38 --- /dev/null +++ b/ejemplos/FirstLetterEqual(1).xml @@ -0,0 +1,102 @@ + + + + + R + a + 1 + 0 + # + + + 1 + a + # + 1 + R + + + 1 + b + R + 1 + # + + + 1 + c + 2 + # + R + + + 2 + a + 3 + # + R + + + 3 + a + 3 + # + R + + + 3 + b + 3 + # + R + + + 0 + b + 4 + # + R + + + 4 + a + 4 + # + R + + + 4 + b + 4 + # + R + + + 4 + c + 5 + # + R + + + 5 + b + 6 + # + R + + + 6 + a + 6 + # + R + + + 6 + b + 6 + # + R + + diff --git a/ejemplos/FirstLetterEqual.xml b/ejemplos/FirstLetterEqual.xml index b029375..283e807 100644 --- a/ejemplos/FirstLetterEqual.xml +++ b/ejemplos/FirstLetterEqual.xml @@ -99,4 +99,18 @@ # R + + 3 + # + 7 + # + * + + + 6 + # + 7 + # + * + diff --git a/ejemplos/TuringIgual0sIgual1s.xml b/ejemplos/TuringIgual0sIgual1s.xml index 06d7ad1..188c3c8 100644 --- a/ejemplos/TuringIgual0sIgual1s.xml +++ b/ejemplos/TuringIgual0sIgual1s.xml @@ -1,5 +1,5 @@ - + 0 diff --git a/ejemplos/mT.xml b/ejemplos/mT.xml index 9239d85..75c14bd 100644 --- a/ejemplos/mT.xml +++ b/ejemplos/mT.xml @@ -1,5 +1,5 @@ - + 0 diff --git a/ejemplos/mT4.xml b/ejemplos/mT4.xml index aa4d925..276e123 100644 --- a/ejemplos/mT4.xml +++ b/ejemplos/mT4.xml @@ -1,5 +1,5 @@ - + 0 diff --git a/ejemplos/mtbase.dtd b/ejemplos/mtbase.dtd index 357ec32..e43b54e 100644 --- a/ejemplos/mtbase.dtd +++ b/ejemplos/mtbase.dtd @@ -1,7 +1,29 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/ejemplos/mtbase_.dtd b/ejemplos/mtbase_.dtd new file mode 100644 index 0000000..61ea1f4 --- /dev/null +++ b/ejemplos/mtbase_.dtd @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/cl/cromer/mt/Automata.java b/src/cl/cromer/mt/Automata.java index fc4da9e..1f0f04e 100644 --- a/src/cl/cromer/mt/Automata.java +++ b/src/cl/cromer/mt/Automata.java @@ -11,10 +11,21 @@ import org.w3c.dom.Document; import java.util.ArrayList; +/** + * Clase que contiene método que guarda y ordena cada transición del archivo XML ya validado + */ + public class Automata { private ArrayList estados; private ArrayList estadosExistentes; + /** + * Constructor de la clase Automata, organiza las etiquetas del XML en un array de estados + * y filtra los subindices de cada estado obtenido + * + * @param document Document del XML + */ + public Automata(Document document) { setEstados(new ArrayList<>()); for (int i = 0; i < document.getElementsByTagName("transicion").getLength(); i++) { @@ -24,27 +35,13 @@ public class Automata { int qj = Integer.parseInt(document.getElementsByTagName("qj").item(i).getTextContent()); char si = document.getElementsByTagName("si").item(i).getTextContent().charAt(0); char sj = document.getElementsByTagName("sj").item(i).getTextContent().charAt(0); - /*if(estados.isEmpty() && qi != qj){ - estados.add(qi, new Estado(qi)); - estados.add(qj, new Estado(qj)); - } - else if(estados.isEmpty() && qi == qj) { - estados.add(qi, new Estado(qi)); - }*/ if (estados.size() <= qi) { estados.add(qi, new Estado(qi)); } if (estados.size() <= qj) { estados.add(qj, new Estado(qj)); } - if (!estados.get(qi).createLink(si, estados.get(qj), sj, move)) { - if (qi == qj) { - System.out.println("Recursivo"); - } - else { - System.out.println("En" + qi + " a " + qj + "Transicion para " + si + " ya esta creada"); - } - } + estados.get(qi).createLink(si, estados.get(qj), sj, move); } else { System.out.println("Movimiento invalido de cinta"); @@ -59,18 +56,38 @@ public class Automata { } } + /** + * Retorna un lista de estados + * + * @return ArrayList de Estados + */ public ArrayList getEstados() { return estados; } + /** + * Asigna una lista de estados + * + * @param estados Estados ya creados + */ public void setEstados(ArrayList estados) { this.estados = estados; } + /** + * Retorna una lista de números que serán los subindices de los estados existentes + * + * @return estadosExistentes Lista de subindices + */ public ArrayList getEstadosExistentes() { return estadosExistentes; } + /** + * Asigna una lista de estados existentes + * + * @param estadosExistentes + */ public void setEstadosExistentes(ArrayList estadosExistentes) { this.estadosExistentes = estadosExistentes; } diff --git a/src/cl/cromer/mt/Enlace.java b/src/cl/cromer/mt/Enlace.java index e88f5f8..b54c74f 100644 --- a/src/cl/cromer/mt/Enlace.java +++ b/src/cl/cromer/mt/Enlace.java @@ -7,12 +7,23 @@ package cl.cromer.mt; +/** + * Clase que funciona como enlaze entre dos estados ó asi mismo + */ public class Enlace { private char si; private char sj; private char movimiento; private Estado qj; + /** + * Contructor de la clase + * + * @param si Simbolo a analizar en la cadena + * @param qj Estado con que se enlaza + * @param sj Simbolo a escribir en la cadena + * @param move Movimiento del indice de la cadena + */ public Enlace(char si, Estado qj, char sj, char move) { setMovimiento(move); setSj(sj); @@ -20,38 +31,83 @@ public class Enlace { setSi(si); } + /** + * Retorna simbolo a analizar + * + * @return simbolo + */ public char getSi() { return this.si; } + /** + * Asigna simbolo a analizar + * + * @param si + */ private void setSi(char si) { this.si = si; } + /** + * Retorna simbolo a escribir + * + * @return simbolo + */ public char getSj() { return this.sj; } + /** + * Asigna simbolo a escribir + * + * @param sj + */ public void setSj(char sj) { this.sj = sj; } + /** + * Retorna el movimiento del indice de la cadena + * + * @return simbolo caracteristico (R,L,E ó *) + */ public char getMovimiento() { return this.movimiento; } + /** + * Asigna el movimiento del indice + * + * @param movimiento simbolo caracteristico (R,L,E ó *) + */ public void setMovimiento(char movimiento) { this.movimiento = movimiento; } + /** + * Retorna el estado con que se enlaza + * + * @return estado siguiente + */ public Estado getQj() { return qj; } + /** + * Asigna el estado con que se enlaza + * + * @param qj estado siguiente + */ public void setQj(Estado qj) { this.qj = qj; } + /** + * Retorna la función de transición definida en un String + * + * @return String con la función + */ @Override public String toString() { return "," + si + ") = (q" + qj.getQ() + "," + sj + "," + movimiento + ")"; diff --git a/src/cl/cromer/mt/Estado.java b/src/cl/cromer/mt/Estado.java index 07623ce..a13c20b 100644 --- a/src/cl/cromer/mt/Estado.java +++ b/src/cl/cromer/mt/Estado.java @@ -8,23 +8,50 @@ package cl.cromer.mt; import java.util.ArrayList; +/** + * Clase que almanecerá un estado con su subindices y sus enlaces adyacentes + */ public class Estado { private final int q; private final ArrayList enlaces; + /** + * Contructor de la clase + * + * @param q Subindice del estado + */ public Estado(int q) { this.q = q; enlaces = new ArrayList<>(); } + /** + * Retorna una lista con los enlaces de un estado + * + * @return ArrayList de Enlaces + */ public ArrayList getEnlaces() { return enlaces; } + /** + * Retorna el subindice asociado al estado + * + * @return Subindice + */ public int getQ() { return q; } + /** + * Crea un enlace entre dos estados ó a si mismo + * + * @param si Simbolo a analizar en la cadena + * @param qj Estado adyacente + * @param sj Simbolo que escribe en la cadena + * @param move Movimiento del cabezal (indice de la cadena) + * @return Verdadero si se creó, falso si ya existe + */ public boolean createLink(char si, Estado qj, char sj, char move) { if (enlaces.isEmpty()) { enlaces.add(new Enlace(si, qj, sj, move)); @@ -38,6 +65,11 @@ public class Estado { return true; } + /** + * Retorna un String con la/s función/es de transición asociado a un estado + * + * @return String con la/s función/es + */ @Override public String toString() { StringBuilder _return = new StringBuilder(); diff --git a/src/cl/cromer/mt/LeerXML.java b/src/cl/cromer/mt/LeerXML.java index c9b6ce0..c4294d0 100644 --- a/src/cl/cromer/mt/LeerXML.java +++ b/src/cl/cromer/mt/LeerXML.java @@ -8,13 +8,15 @@ package cl.cromer.mt; import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import javax.print.Doc; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.*; /** - * Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase.dtd + * Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase_.dtd */ class LeerXML { /** @@ -61,7 +63,10 @@ class LeerXML { DocumentBuilder db = dbf.newDocumentBuilder(); documento = db.parse(archivo); documento.getDocumentElement().normalize(); - return documento; + if(validarEtiquetas(documento)){ + return documento; + } + return null; } catch (Exception e) { if (e.getMessage().contains(".dtd")) { @@ -111,10 +116,10 @@ class LeerXML { BufferedReader br = new BufferedReader(new FileReader(original)); BufferedWriter bw = new BufferedWriter(new FileWriter(temp)); if ((aux = br.readLine()).startsWith(""); + bw.write(aux + "\n"); } else { - bw.write("\n" + aux); + bw.write("\n" + aux); } for (aux = ""; aux != null; aux = br.readLine()) { if (!aux.startsWith("