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>
|
||||
<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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
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;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
@ -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 + ")";
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user