Agregado la documentación de cada metodo y clase faltante

This commit is contained in:
carlos 2017-07-06 15:59:51 +00:00
parent ae6fd885e0
commit 391450ec1c
12 changed files with 416 additions and 67 deletions

View 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>

View File

@ -99,4 +99,18 @@
<sj>#</sj>
<movimiento>R</movimiento>
</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>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "mtbase.dtd">
<!DOCTYPE root SYSTEM "mtbase_.dtd">
<root>
<transicion>
<qi>0</qi>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "mtbase.dtd">
<!DOCTYPE root SYSTEM "mtbase_.dtd">
<root>
<transicion>
<qi>0</qi>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "mtbase.dtd">
<!DOCTYPE root SYSTEM "mtbase_.dtd">
<root>
<transicion>
<si>0</si>

View File

@ -1,7 +1,29 @@
<!ELEMENT root (transicion+)>
<!ELEMENT transicion (qi,si,qj,sj,movimiento)>
<!ELEMENT qi (#PCDATA)>
<!ELEMENT si (#PCDATA)>
<!ELEMENT qj (#PCDATA)>
<!ELEMENT sj (#PCDATA)>
<?xml encoding="UTF-8"?>
<!ELEMENT root (transicion)+>
<!ATTLIST root
xmlns CDATA #FIXED ''>
<!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
View 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)>

View File

@ -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<Estado> estados;
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) {
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<Estado> getEstados() {
return estados;
}
/**
* Asigna una lista de estados
*
* @param estados Estados ya creados
*/
public void setEstados(ArrayList<Estado> 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() {
return estadosExistentes;
}
/**
* Asigna una lista de estados existentes
*
* @param estadosExistentes
*/
public void setEstadosExistentes(ArrayList<Integer> estadosExistentes) {
this.estadosExistentes = estadosExistentes;
}

View File

@ -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 + ")";

View File

@ -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<Enlace> 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<Enlace> 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();

View File

@ -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,8 +63,11 @@ class LeerXML {
DocumentBuilder db = dbf.newDocumentBuilder();
documento = db.parse(archivo);
documento.getDocumentElement().normalize();
if(validarEtiquetas(documento)){
return documento;
}
return null;
}
catch (Exception e) {
if (e.getMessage().contains(".dtd")) {
return validarXML(archivo);
@ -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("<?xml")) {
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase.dtd\">");
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase_.dtd\">");
}
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()) {
if (!aux.startsWith("<!DOCTYPE")) {
@ -128,4 +133,36 @@ class LeerXML {
}
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;
}
}

View File

@ -9,6 +9,9 @@ package cl.cromer.mt;
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 {
private final Automata maquina;
private Estado estadoActual;
@ -16,79 +19,120 @@ public class Maquina {
private String cintaAnterior;
private int cabezal;
/**
* Constructor de la clase
*
* @param document Document asociado al XML
*/
public Maquina(Document document) {
maquina = new Automata(document);
reset();
}
/**
* Retorna la maquina de Turing
*
* @return maquina asociado a alguna función de transición
*/
public Automata getMaquina() {
return maquina;
}
/**
* Retorna el estado en que esta la maquina
*
* @return estado actual
*/
public Estado getEstadoActual() {
return estadoActual;
}
/**
* Asigna un estado actual que esta la maquina en un instante de tiempo
*
* @param estadoActual
*/
public void setEstadoActual(Estado 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() {
return enlaceActual;
}
/**
* Asigna un enlace actual que esta la maquina en un instante de tiempo
*
* @param enlaceActual
*/
public void setEnlaceActual(Enlace enlaceActual) {
this.enlaceActual = enlaceActual;
}
/**
* Retorna la cadena anterior a que la maquina hiciera cambios
*
* @return la cadena anterior
*/
public String getCintaAnterior() {
return cintaAnterior;
}
/**
* Asigna la cadena anterior a que la maquina hiciera cambios
* @param cintaAnterior
*/
public void setCintaAnterior(String cintaAnterior) {
this.cintaAnterior = cintaAnterior;
}
/**
* Retorna el indice en que se ubica en la cadena (Cabezal)
*
* @return un número asociado
*/
public int getCabezal() {
return cabezal;
}
/**
* Asigna el indice en que se ubica en la cadena (Cabezal)
*
* @param cabezal
*/
public void setCabezal(int cabezal) {
this.cabezal = cabezal;
}
/**
* Inicializa atributos
*/
public void reset() {
setEstadoActual(maquina.getEstados().get(0));
setEstadoActual(getMaquina().getEstados().get(0));
setEnlaceActual(null);
setCintaAnterior("");
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) {
//estadoActual = maquina.getEstados().get(0);
int i;
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
switch (getEnlaceActual().getMovimiento()) {
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*/}
}
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
setEstadoActual(getEnlaceActual().getQj());
i = -1;
}
@ -103,6 +147,15 @@ public class Maquina {
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) {
setCintaAnterior(cinta.toString());
int i;
@ -111,7 +164,26 @@ public class Maquina {
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
setEstadoActual(getEnlaceActual().getQj());
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': {
setCabezal(getCabezal() - 1);
if (getCabezal() == (-1)) {
@ -129,16 +201,6 @@ public class Maquina {
}
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;
}
}