Agregado la documentación de cada metodo y clase faltante
This commit is contained in:
parent
ae6fd885e0
commit
391450ec1c
102
ejemplos/FirstLetterEqual(1).xml
Normal file
102
ejemplos/FirstLetterEqual(1).xml
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE root SYSTEM "mtbase.dtd">
|
||||||
|
<root>
|
||||||
|
<transicion>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
<si>a</si>
|
||||||
|
<qj>1</qj>
|
||||||
|
<qi>0</qi>
|
||||||
|
<sj>#</sj>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>1</qi>
|
||||||
|
<si>a</si>
|
||||||
|
<sj>#</sj>
|
||||||
|
<qj>1</qj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>1</qi>
|
||||||
|
<si>b</si>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
<qj>1</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>1</qi>
|
||||||
|
<si>c</si>
|
||||||
|
<qj>2</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>2</qi>
|
||||||
|
<si>a</si>
|
||||||
|
<qj>3</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>3</qi>
|
||||||
|
<si>a</si>
|
||||||
|
<qj>3</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>3</qi>
|
||||||
|
<si>b</si>
|
||||||
|
<qj>3</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>0</qi>
|
||||||
|
<si>b</si>
|
||||||
|
<qj>4</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>4</qi>
|
||||||
|
<si>a</si>
|
||||||
|
<qj>4</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>4</qi>
|
||||||
|
<si>b</si>
|
||||||
|
<qj>4</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>4</qi>
|
||||||
|
<si>c</si>
|
||||||
|
<qj>5</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>5</qi>
|
||||||
|
<si>b</si>
|
||||||
|
<qj>6</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>6</qi>
|
||||||
|
<si>a</si>
|
||||||
|
<qj>6</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>6</qi>
|
||||||
|
<si>b</si>
|
||||||
|
<qj>6</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>R</movimiento>
|
||||||
|
</transicion>
|
||||||
|
</root>
|
@ -99,4 +99,18 @@
|
|||||||
<sj>#</sj>
|
<sj>#</sj>
|
||||||
<movimiento>R</movimiento>
|
<movimiento>R</movimiento>
|
||||||
</transicion>
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>3</qi>
|
||||||
|
<si>#</si>
|
||||||
|
<qj>7</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>*</movimiento>
|
||||||
|
</transicion>
|
||||||
|
<transicion>
|
||||||
|
<qi>6</qi>
|
||||||
|
<si>#</si>
|
||||||
|
<qj>7</qj>
|
||||||
|
<sj>#</sj>
|
||||||
|
<movimiento>*</movimiento>
|
||||||
|
</transicion>
|
||||||
</root>
|
</root>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE root SYSTEM "mtbase.dtd">
|
<!DOCTYPE root SYSTEM "mtbase_.dtd">
|
||||||
<root>
|
<root>
|
||||||
<transicion>
|
<transicion>
|
||||||
<qi>0</qi>
|
<qi>0</qi>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE root SYSTEM "mtbase.dtd">
|
<!DOCTYPE root SYSTEM "mtbase_.dtd">
|
||||||
<root>
|
<root>
|
||||||
<transicion>
|
<transicion>
|
||||||
<qi>0</qi>
|
<qi>0</qi>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE root SYSTEM "mtbase.dtd">
|
<!DOCTYPE root SYSTEM "mtbase_.dtd">
|
||||||
<root>
|
<root>
|
||||||
<transicion>
|
<transicion>
|
||||||
<si>0</si>
|
<si>0</si>
|
||||||
|
@ -1,7 +1,29 @@
|
|||||||
<!ELEMENT root (transicion+)>
|
<?xml encoding="UTF-8"?>
|
||||||
<!ELEMENT transicion (qi,si,qj,sj,movimiento)>
|
|
||||||
<!ELEMENT qi (#PCDATA)>
|
<!ELEMENT root (transicion)+>
|
||||||
<!ELEMENT si (#PCDATA)>
|
<!ATTLIST root
|
||||||
<!ELEMENT qj (#PCDATA)>
|
xmlns CDATA #FIXED ''>
|
||||||
<!ELEMENT sj (#PCDATA)>
|
|
||||||
<!ELEMENT movimiento (#PCDATA)>
|
<!ELEMENT transicion (movimiento|qi|qj|si|sj)+>
|
||||||
|
<!ATTLIST transicion
|
||||||
|
xmlns CDATA #FIXED ''>
|
||||||
|
|
||||||
|
<!ELEMENT movimiento (#PCDATA)>
|
||||||
|
<!ATTLIST movimiento
|
||||||
|
xmlns CDATA #FIXED ''>
|
||||||
|
|
||||||
|
<!ELEMENT qi (#PCDATA)>
|
||||||
|
<!ATTLIST qi
|
||||||
|
xmlns CDATA #FIXED ''>
|
||||||
|
|
||||||
|
<!ELEMENT qj (#PCDATA)>
|
||||||
|
<!ATTLIST qj
|
||||||
|
xmlns CDATA #FIXED ''>
|
||||||
|
|
||||||
|
<!ELEMENT si (#PCDATA)>
|
||||||
|
<!ATTLIST si
|
||||||
|
xmlns CDATA #FIXED ''>
|
||||||
|
|
||||||
|
<!ELEMENT sj (#PCDATA)>
|
||||||
|
<!ATTLIST sj
|
||||||
|
xmlns CDATA #FIXED ''>
|
||||||
|
7
ejemplos/mtbase_.dtd
Normal file
7
ejemplos/mtbase_.dtd
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!ELEMENT root (transicion+)>
|
||||||
|
<!ELEMENT transicion (qi|si|qj|sj|movimiento)>
|
||||||
|
<!ELEMENT qi (#PCDATA)>
|
||||||
|
<!ELEMENT si (#PCDATA)>
|
||||||
|
<!ELEMENT qj (#PCDATA)>
|
||||||
|
<!ELEMENT sj (#PCDATA)>
|
||||||
|
<!ELEMENT movimiento (#PCDATA)>
|
@ -11,10 +11,21 @@ import org.w3c.dom.Document;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clase que contiene método que guarda y ordena cada transición del archivo XML ya validado
|
||||||
|
*/
|
||||||
|
|
||||||
public class Automata {
|
public class Automata {
|
||||||
private ArrayList<Estado> estados;
|
private ArrayList<Estado> estados;
|
||||||
private ArrayList<Integer> estadosExistentes;
|
private ArrayList<Integer> 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) {
|
public Automata(Document document) {
|
||||||
setEstados(new ArrayList<>());
|
setEstados(new ArrayList<>());
|
||||||
for (int i = 0; i < document.getElementsByTagName("transicion").getLength(); i++) {
|
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());
|
int qj = Integer.parseInt(document.getElementsByTagName("qj").item(i).getTextContent());
|
||||||
char si = document.getElementsByTagName("si").item(i).getTextContent().charAt(0);
|
char si = document.getElementsByTagName("si").item(i).getTextContent().charAt(0);
|
||||||
char sj = document.getElementsByTagName("sj").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) {
|
if (estados.size() <= qi) {
|
||||||
estados.add(qi, new Estado(qi));
|
estados.add(qi, new Estado(qi));
|
||||||
}
|
}
|
||||||
if (estados.size() <= qj) {
|
if (estados.size() <= qj) {
|
||||||
estados.add(qj, new Estado(qj));
|
estados.add(qj, new Estado(qj));
|
||||||
}
|
}
|
||||||
if (!estados.get(qi).createLink(si, estados.get(qj), sj, move)) {
|
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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
System.out.println("Movimiento invalido de cinta");
|
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<Estado> getEstados() {
|
public ArrayList<Estado> getEstados() {
|
||||||
return estados;
|
return estados;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna una lista de estados
|
||||||
|
*
|
||||||
|
* @param estados Estados ya creados
|
||||||
|
*/
|
||||||
public void setEstados(ArrayList<Estado> estados) {
|
public void setEstados(ArrayList<Estado> estados) {
|
||||||
this.estados = 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<Integer> getEstadosExistentes() {
|
public ArrayList<Integer> getEstadosExistentes() {
|
||||||
return estadosExistentes;
|
return estadosExistentes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna una lista de estados existentes
|
||||||
|
*
|
||||||
|
* @param estadosExistentes
|
||||||
|
*/
|
||||||
public void setEstadosExistentes(ArrayList<Integer> estadosExistentes) {
|
public void setEstadosExistentes(ArrayList<Integer> estadosExistentes) {
|
||||||
this.estadosExistentes = estadosExistentes;
|
this.estadosExistentes = estadosExistentes;
|
||||||
}
|
}
|
||||||
|
@ -7,12 +7,23 @@
|
|||||||
|
|
||||||
package cl.cromer.mt;
|
package cl.cromer.mt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clase que funciona como enlaze entre dos estados ó asi mismo
|
||||||
|
*/
|
||||||
public class Enlace {
|
public class Enlace {
|
||||||
private char si;
|
private char si;
|
||||||
private char sj;
|
private char sj;
|
||||||
private char movimiento;
|
private char movimiento;
|
||||||
private Estado qj;
|
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) {
|
public Enlace(char si, Estado qj, char sj, char move) {
|
||||||
setMovimiento(move);
|
setMovimiento(move);
|
||||||
setSj(sj);
|
setSj(sj);
|
||||||
@ -20,38 +31,83 @@ public class Enlace {
|
|||||||
setSi(si);
|
setSi(si);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna simbolo a analizar
|
||||||
|
*
|
||||||
|
* @return simbolo
|
||||||
|
*/
|
||||||
public char getSi() {
|
public char getSi() {
|
||||||
return this.si;
|
return this.si;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna simbolo a analizar
|
||||||
|
*
|
||||||
|
* @param si
|
||||||
|
*/
|
||||||
private void setSi(char si) {
|
private void setSi(char si) {
|
||||||
this.si = si;
|
this.si = si;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna simbolo a escribir
|
||||||
|
*
|
||||||
|
* @return simbolo
|
||||||
|
*/
|
||||||
public char getSj() {
|
public char getSj() {
|
||||||
return this.sj;
|
return this.sj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna simbolo a escribir
|
||||||
|
*
|
||||||
|
* @param sj
|
||||||
|
*/
|
||||||
public void setSj(char sj) {
|
public void setSj(char sj) {
|
||||||
this.sj = sj;
|
this.sj = sj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna el movimiento del indice de la cadena
|
||||||
|
*
|
||||||
|
* @return simbolo caracteristico (R,L,E ó *)
|
||||||
|
*/
|
||||||
public char getMovimiento() {
|
public char getMovimiento() {
|
||||||
return this.movimiento;
|
return this.movimiento;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna el movimiento del indice
|
||||||
|
*
|
||||||
|
* @param movimiento simbolo caracteristico (R,L,E ó *)
|
||||||
|
*/
|
||||||
public void setMovimiento(char movimiento) {
|
public void setMovimiento(char movimiento) {
|
||||||
this.movimiento = movimiento;
|
this.movimiento = movimiento;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna el estado con que se enlaza
|
||||||
|
*
|
||||||
|
* @return estado siguiente
|
||||||
|
*/
|
||||||
public Estado getQj() {
|
public Estado getQj() {
|
||||||
return qj;
|
return qj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna el estado con que se enlaza
|
||||||
|
*
|
||||||
|
* @param qj estado siguiente
|
||||||
|
*/
|
||||||
public void setQj(Estado qj) {
|
public void setQj(Estado qj) {
|
||||||
this.qj = qj;
|
this.qj = qj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna la función de transición definida en un String
|
||||||
|
*
|
||||||
|
* @return String con la función
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "," + si + ") = (q" + qj.getQ() + "," + sj + "," + movimiento + ")";
|
return "," + si + ") = (q" + qj.getQ() + "," + sj + "," + movimiento + ")";
|
||||||
|
@ -8,23 +8,50 @@ package cl.cromer.mt;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clase que almanecerá un estado con su subindices y sus enlaces adyacentes
|
||||||
|
*/
|
||||||
public class Estado {
|
public class Estado {
|
||||||
private final int q;
|
private final int q;
|
||||||
private final ArrayList<Enlace> enlaces;
|
private final ArrayList<Enlace> enlaces;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contructor de la clase
|
||||||
|
*
|
||||||
|
* @param q Subindice del estado
|
||||||
|
*/
|
||||||
public Estado(int q) {
|
public Estado(int q) {
|
||||||
this.q = q;
|
this.q = q;
|
||||||
enlaces = new ArrayList<>();
|
enlaces = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna una lista con los enlaces de un estado
|
||||||
|
*
|
||||||
|
* @return ArrayList de Enlaces
|
||||||
|
*/
|
||||||
public ArrayList<Enlace> getEnlaces() {
|
public ArrayList<Enlace> getEnlaces() {
|
||||||
return enlaces;
|
return enlaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna el subindice asociado al estado
|
||||||
|
*
|
||||||
|
* @return Subindice
|
||||||
|
*/
|
||||||
public int getQ() {
|
public int getQ() {
|
||||||
return q;
|
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) {
|
public boolean createLink(char si, Estado qj, char sj, char move) {
|
||||||
if (enlaces.isEmpty()) {
|
if (enlaces.isEmpty()) {
|
||||||
enlaces.add(new Enlace(si, qj, sj, move));
|
enlaces.add(new Enlace(si, qj, sj, move));
|
||||||
@ -38,6 +65,11 @@ public class Estado {
|
|||||||
return true;
|
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
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder _return = new StringBuilder();
|
StringBuilder _return = new StringBuilder();
|
||||||
|
@ -8,13 +8,15 @@
|
|||||||
package cl.cromer.mt;
|
package cl.cromer.mt;
|
||||||
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
|
import javax.print.Doc;
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import java.io.*;
|
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 {
|
class LeerXML {
|
||||||
/**
|
/**
|
||||||
@ -61,8 +63,11 @@ class LeerXML {
|
|||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
documento = db.parse(archivo);
|
documento = db.parse(archivo);
|
||||||
documento.getDocumentElement().normalize();
|
documento.getDocumentElement().normalize();
|
||||||
|
if(validarEtiquetas(documento)){
|
||||||
return documento;
|
return documento;
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
if (e.getMessage().contains(".dtd")) {
|
if (e.getMessage().contains(".dtd")) {
|
||||||
return validarXML(archivo);
|
return validarXML(archivo);
|
||||||
@ -111,10 +116,10 @@ class LeerXML {
|
|||||||
BufferedReader br = new BufferedReader(new FileReader(original));
|
BufferedReader br = new BufferedReader(new FileReader(original));
|
||||||
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
|
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
|
||||||
if ((aux = br.readLine()).startsWith("<?xml")) {
|
if ((aux = br.readLine()).startsWith("<?xml")) {
|
||||||
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase.dtd\">");
|
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase_.dtd\">");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bw.write("<!DOCTYPE root SYSTEM \"mtbase.dtd\">\n" + aux);
|
bw.write("<!DOCTYPE root SYSTEM \"mtbase_.dtd\">\n" + aux);
|
||||||
}
|
}
|
||||||
for (aux = ""; aux != null; aux = br.readLine()) {
|
for (aux = ""; aux != null; aux = br.readLine()) {
|
||||||
if (!aux.startsWith("<!DOCTYPE")) {
|
if (!aux.startsWith("<!DOCTYPE")) {
|
||||||
@ -128,4 +133,36 @@ class LeerXML {
|
|||||||
}
|
}
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valida las etiquetas en el XML
|
||||||
|
*
|
||||||
|
* @param document XML a analizar
|
||||||
|
*
|
||||||
|
* @return Verdadero si esta correcto, caso contrario falso
|
||||||
|
*/
|
||||||
|
private boolean validarEtiquetas(Document document) {
|
||||||
|
NodeList etiquetas = document.getElementsByTagName("*");
|
||||||
|
for (int i = 0; i < etiquetas.getLength(); i++) {
|
||||||
|
switch (etiquetas.item(i).getNodeName()) {
|
||||||
|
case "root":
|
||||||
|
break;
|
||||||
|
case "transicion":
|
||||||
|
break;
|
||||||
|
case "qi":
|
||||||
|
break;
|
||||||
|
case "si":
|
||||||
|
break;
|
||||||
|
case "qj":
|
||||||
|
break;
|
||||||
|
case "sj":
|
||||||
|
break;
|
||||||
|
case "movimiento":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
@ -9,6 +9,9 @@ package cl.cromer.mt;
|
|||||||
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clase de la Maquina de Turing que renocerá algún asociado a las transiciones escritas en un archivo XML
|
||||||
|
*/
|
||||||
public class Maquina {
|
public class Maquina {
|
||||||
private final Automata maquina;
|
private final Automata maquina;
|
||||||
private Estado estadoActual;
|
private Estado estadoActual;
|
||||||
@ -16,79 +19,120 @@ public class Maquina {
|
|||||||
private String cintaAnterior;
|
private String cintaAnterior;
|
||||||
private int cabezal;
|
private int cabezal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor de la clase
|
||||||
|
*
|
||||||
|
* @param document Document asociado al XML
|
||||||
|
*/
|
||||||
public Maquina(Document document) {
|
public Maquina(Document document) {
|
||||||
maquina = new Automata(document);
|
maquina = new Automata(document);
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna la maquina de Turing
|
||||||
|
*
|
||||||
|
* @return maquina asociado a alguna función de transición
|
||||||
|
*/
|
||||||
public Automata getMaquina() {
|
public Automata getMaquina() {
|
||||||
return maquina;
|
return maquina;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna el estado en que esta la maquina
|
||||||
|
*
|
||||||
|
* @return estado actual
|
||||||
|
*/
|
||||||
public Estado getEstadoActual() {
|
public Estado getEstadoActual() {
|
||||||
return estadoActual;
|
return estadoActual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna un estado actual que esta la maquina en un instante de tiempo
|
||||||
|
*
|
||||||
|
* @param estadoActual
|
||||||
|
*/
|
||||||
public void setEstadoActual(Estado estadoActual) {
|
public void setEstadoActual(Estado estadoActual) {
|
||||||
this.estadoActual = estadoActual;
|
this.estadoActual = estadoActual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna un enlace en que la maquina asocio a la cadena ingresada y al cabezal que se encuentra
|
||||||
|
*
|
||||||
|
* @return el enlace actual
|
||||||
|
*/
|
||||||
public Enlace getEnlaceActual() {
|
public Enlace getEnlaceActual() {
|
||||||
return enlaceActual;
|
return enlaceActual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna un enlace actual que esta la maquina en un instante de tiempo
|
||||||
|
*
|
||||||
|
* @param enlaceActual
|
||||||
|
*/
|
||||||
public void setEnlaceActual(Enlace enlaceActual) {
|
public void setEnlaceActual(Enlace enlaceActual) {
|
||||||
this.enlaceActual = enlaceActual;
|
this.enlaceActual = enlaceActual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna la cadena anterior a que la maquina hiciera cambios
|
||||||
|
*
|
||||||
|
* @return la cadena anterior
|
||||||
|
*/
|
||||||
public String getCintaAnterior() {
|
public String getCintaAnterior() {
|
||||||
return cintaAnterior;
|
return cintaAnterior;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna la cadena anterior a que la maquina hiciera cambios
|
||||||
|
* @param cintaAnterior
|
||||||
|
*/
|
||||||
public void setCintaAnterior(String cintaAnterior) {
|
public void setCintaAnterior(String cintaAnterior) {
|
||||||
this.cintaAnterior = cintaAnterior;
|
this.cintaAnterior = cintaAnterior;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retorna el indice en que se ubica en la cadena (Cabezal)
|
||||||
|
*
|
||||||
|
* @return un número asociado
|
||||||
|
*/
|
||||||
public int getCabezal() {
|
public int getCabezal() {
|
||||||
return cabezal;
|
return cabezal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asigna el indice en que se ubica en la cadena (Cabezal)
|
||||||
|
*
|
||||||
|
* @param cabezal
|
||||||
|
*/
|
||||||
public void setCabezal(int cabezal) {
|
public void setCabezal(int cabezal) {
|
||||||
this.cabezal = cabezal;
|
this.cabezal = cabezal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inicializa atributos
|
||||||
|
*/
|
||||||
public void reset() {
|
public void reset() {
|
||||||
setEstadoActual(maquina.getEstados().get(0));
|
setEstadoActual(getMaquina().getEstados().get(0));
|
||||||
setEnlaceActual(null);
|
setEnlaceActual(null);
|
||||||
setCintaAnterior("");
|
setCintaAnterior("");
|
||||||
setCabezal(0);
|
setCabezal(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comprueba que si la cadena ingresada es reconocida por la maquina
|
||||||
|
*
|
||||||
|
* @param cinta cadena ingresada por el usuario
|
||||||
|
* @param estadoFinal Arreglo de estados finales, también ingresados por usuario
|
||||||
|
* @return Verdadero si lo reconoce, caso contrario, falso
|
||||||
|
*/
|
||||||
public boolean comprobarCadena(StringBuilder cinta, int[] estadoFinal) {
|
public boolean comprobarCadena(StringBuilder cinta, int[] estadoFinal) {
|
||||||
//estadoActual = maquina.getEstados().get(0);
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
|
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
|
||||||
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
|
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
|
||||||
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
|
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
|
||||||
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
|
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
|
||||||
switch (getEnlaceActual().getMovimiento()) {
|
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
|
||||||
case 'L': {
|
|
||||||
setCabezal(getCabezal() - 1);
|
|
||||||
if (getCabezal() == (-1)) {
|
|
||||||
cinta.insert(0, "#");
|
|
||||||
setCabezal(getCabezal() + 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'R': {
|
|
||||||
setCabezal(getCabezal() + 1);
|
|
||||||
if (getCabezal() == cinta.length()) {
|
|
||||||
cinta.insert(getCabezal(), "#");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {/*Se mantiene*/}
|
|
||||||
}
|
|
||||||
setEstadoActual(getEnlaceActual().getQj());
|
setEstadoActual(getEnlaceActual().getQj());
|
||||||
i = -1;
|
i = -1;
|
||||||
}
|
}
|
||||||
@ -103,6 +147,15 @@ public class Maquina {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comprueba que si el simbolo en la cadena, identificado por el cabezal
|
||||||
|
* es reconocido por la maquina. Este guarda la cadena anterior, estado actual y
|
||||||
|
* un enlace actual
|
||||||
|
*
|
||||||
|
* @param cinta Cadena ingresada por el usuario
|
||||||
|
* @param estadoFinal Arreglo de estados finales, también ingresados por usuario
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public boolean comprobarCadenaS2S(StringBuilder cinta, int[] estadoFinal) {
|
public boolean comprobarCadenaS2S(StringBuilder cinta, int[] estadoFinal) {
|
||||||
setCintaAnterior(cinta.toString());
|
setCintaAnterior(cinta.toString());
|
||||||
int i;
|
int i;
|
||||||
@ -111,7 +164,26 @@ public class Maquina {
|
|||||||
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
|
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
|
||||||
setEstadoActual(getEnlaceActual().getQj());
|
setEstadoActual(getEnlaceActual().getQj());
|
||||||
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
|
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
|
||||||
switch (getEnlaceActual().getMovimiento()) {
|
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < estadoFinal.length; i++) {
|
||||||
|
if (getEstadoActual().getQ() == estadoFinal[i]) {
|
||||||
|
setEnlaceActual(null); // Indicar que no hay más transiciones
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Realiza el movimiento correspondiente a base del caracter guardado en [movimiento]
|
||||||
|
* @param mov caracter asociado al movimiento
|
||||||
|
* @param cinta Cadena ingresada por el usuario
|
||||||
|
*/
|
||||||
|
private void movimientoCabezal(char mov,StringBuilder cinta) {
|
||||||
|
switch (mov) {
|
||||||
case 'L': {
|
case 'L': {
|
||||||
setCabezal(getCabezal() - 1);
|
setCabezal(getCabezal() - 1);
|
||||||
if (getCabezal() == (-1)) {
|
if (getCabezal() == (-1)) {
|
||||||
@ -129,16 +201,6 @@ public class Maquina {
|
|||||||
}
|
}
|
||||||
default: {/*Se mantiene*/}
|
default: {/*Se mantiene*/}
|
||||||
}
|
}
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i = 0; i < estadoFinal.length; i++) {
|
|
||||||
if (getEstadoActual().getQ() == estadoFinal[i]) {
|
|
||||||
setEnlaceActual(null); // Indicar que no hay más transiciones
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user