Implementados metodos para reorganizar los estados en un ArrayList de Estados y a su vez los enlaces en un ArrayList de enlaces (Lista de adyacencia)

This commit is contained in:
carlos 2017-06-28 14:09:44 +00:00
parent 66284f875a
commit 75083921a0
5 changed files with 215 additions and 15 deletions

98
src/mt/Automata.java Normal file
View File

@ -0,0 +1,98 @@
package mt;
import org.w3c.dom.Document;
import java.util.ArrayList;
class Enlace{
char si;
char sj;
char movimiento;
Estado qj;
public Enlace(char si,Estado qj,char sj, char move){
setMovimiento(move);
setSj(sj);
setQj(qj);
setSi(si);
}
private void setSi(char si){
this.si = si;
}
private void setSj(char sj){
this.sj = sj;
}
private void setMovimiento(char movimiento){
this.movimiento = movimiento;
}
private void setQj(Estado qj){
this.qj = qj;
}
@Override
public String toString(){
return ","+si+") = (q"+qj.q+","+sj+","+movimiento+")";
}
}
class Estado{
int q;
ArrayList<Enlace> link;
public Estado(int q) {
this.q = q;
link = new ArrayList<Enlace>();
}
public boolean createLink(char si,Estado qj,char sj, char move){
if(link.isEmpty()) link.add(new Enlace(si,qj,sj,move));
for(int i=0;i<link.size();i++){
if(link.get(i).si == si) return false;
}
link.add(new Enlace(si,qj,sj,move));
return true;
}
@Override
public String toString(){
String _return = "";
for(int i=0; i<link.size();i++){
_return += "(q"+q+link.get(i)+"\n";
}
return _return;
}
}
class Automata {
ArrayList<Estado> estados;
public Automata(Document document){
estados = new ArrayList<Estado>();
Estado aux;
for(int i=0;i<document.getElementsByTagName("transicion").getLength();i++){
char move = document.getElementsByTagName("movimiento").item(i).getTextContent().charAt(0);
if(move == 'E' || move == 'R' || move == 'L' || move == '*'){
int qi = Integer.parseInt(document.getElementsByTagName("qi").item(i).getTextContent());
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");
}
}else{
System.out.println("Movimiento invalido de cinta");
System.exit(1);
}
}
}
}

View File

@ -30,6 +30,10 @@ class LeerXML {
* @return Devuelve un document de XML o null si hay algun error.
*/
Document leerArchivo(File archivo) {
if(archivo == null){
System.out.println("No se ha seleccionado archivo");
return null;
}
if (!archivo.exists() || !archivo.getName().endsWith(".xml")) {
System.out.println("Archivo " + archivo.getName() + " no existe o no es compatible");
return null;
@ -160,7 +164,7 @@ class LeerXML {
* @throws SAXException La excepción thrown
*/
public void error(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
//System.out.println(e.getMessage());
error = true;
}
@ -172,7 +176,7 @@ class LeerXML {
* @throws SAXException La excepción thrown
*/
public void fatalError(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
//System.out.println(e.getMessage());
error = true;
}
@ -193,7 +197,7 @@ class LeerXML {
*/
@Override
public void error(org.xml.sax.SAXParseException e) {
System.out.println(e.getMessage());
//System.out.println(e.getMessage());
error = true;
}
@ -204,7 +208,7 @@ class LeerXML {
*/
@Override
public void fatalError(org.xml.sax.SAXParseException e) {
System.out.println(e.getMessage());
//System.out.println(e.getMessage());
error = true;
}
}

View File

@ -30,6 +30,8 @@ public class MT extends Application {
* @param primaryStage La ventana principal
* @throws Exception La excepción
*/
static Machine machine;
@Override
public void start(final Stage primaryStage) throws Exception{
//Parent root = FXMLLoader.load(getClass().getResource("mt.fxml"));
@ -47,16 +49,12 @@ public class MT extends Application {
File archivo = fileChooser.showOpenDialog(primaryStage);
LeerXML xml = new LeerXML();
Document document = xml.leerArchivo(archivo);
if (document != null) {
System.out.println(document.getDocumentElement().getNodeName());
for(int i=0;i<document.getElementsByTagName("transicion").getLength();i++){
System.out.println("("+document.getElementsByTagName("qi").item(i).getTextContent()+","+
document.getElementsByTagName("si").item(i).getTextContent()+") = ("+
document.getElementsByTagName("qj").item(i).getTextContent()+","+
document.getElementsByTagName("sj").item(i).getTextContent()+","+
document.getElementsByTagName("movimiento").item(i).getTextContent()+")");
}//Ciclo base para obtener la función completa de las transiciones
}
if(document != null) {
machine = new Machine(document);
for(int i=0; i<machine.machine.estados.size();i++){
System.out.println(machine.machine.estados.get(i));
}
}
}
};
button.addEventFilter(MouseEvent.MOUSE_CLICKED,eventHandler);

View File

@ -6,6 +6,11 @@
*/
package mt;
import org.w3c.dom.Document;
public class Controller {
public class Machine {
Automata machine;
public Machine(Document document){
machine = new Automata(document);
}
}

View File

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "mtbase.dtd">
<root>
<transicion>
<qi>0</qi>
<si>0</si>
<qj>1</qj>
<sj>X</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>1</qi>
<si>0</si>
<qj>1</qj>
<sj>0</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>1</qi>
<si>Y</si>
<qj>1</qj>
<sj>Y</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>1</qi>
<si>1</si>
<qj>2</qj>
<sj>Y</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>2</qi>
<si>X</si>
<qj>0</qj>
<sj>X</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>2</qi>
<si>0</si>
<qj>2</qj>
<sj>0</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>2</qi>
<si>#</si>
<qj>3</qj>
<sj>#</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>2</qi>
<si>1</si>
<qj>2</qj>
<sj>1</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>2</qi>
<si>Y</si>
<qj>2</qj>
<sj>Y</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>3</qi>
<si>Y</si>
<qj>3</qj>
<sj>Y</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>3</qi>
<si>X</si>
<qj>4</qj>
<sj>X</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>4</qi>
<si>X</si>
<qj>4</qj>
<sj>X</sj>
<movimiento>L</movimiento>
</transicion>
<transicion>
<qi>4</qi>
<si>#</si>
<qj>5</qj>
<sj>#</sj>
<movimiento>R</movimiento>
</transicion>
</root>