lunes, 19 de octubre de 2009

Examen!



El conjunto de las palabras en {a, b} tales que toda a est´a precedida por alguna
b, como por ejemplo “"”, “b”, “bba”, “babaa”, etc.


Este programa acepta palabras que contengan solo a y b en su lenguaje, con la unica condicion es que por cada a que coloquemos siempre debe de haber una b:





Palabras aceptadas: b, ba, bab, baba, bababa, bbabbabb etc.




No aceptadas: a, ab, abb, ababaa, abbba, etc.




Con el siguiente automata finito:







Y la Tabla de Transiciones:


Estado a b FC


1 2 3 A

2 2 2 E

3 4 3 A

4 2 3 A





public class Lexico {
public String comprueba(String palabra)
{
String nuevacadena=palabra+ '%';
int tam=nuevacadena.length();
String resultado=null;
int mat [][]=new int [5][3];

// TABLA DE TRANSICIONES

// A B FC
mat[0][0]=2; mat[0][1]=3; mat[0][2]=90;
mat[1][0]=2; mat[1][1]=2; mat[1][2]=90;
mat[2][0]=4; mat[2][1]=3; mat[2][2]=100;
mat[3][0]=2; mat[3][1]=3; mat[3][2]=100;


//comienza el ciclo, donde compara cada una de las letras de la palabra.
int reng=1, colu=0;
try
{
for(int i=0;i {
reng=reng-1;



if(nuevacadena.charAt(i)=='a')
{
colu=0;
reng=mat[reng][colu];

}

if(nuevacadena.charAt(i)=='b')
{
colu=1;
reng=mat[reng][colu];

}


if(nuevacadena.charAt(i)=='%') //Marca el fin de cadena
{
nuevacadena=palabra;
colu=2;
if(mat[reng][colu]==100)
{
resultado= "Cadena Valida";
}
else
resultado= "Cadena Invalida";

}
}
}catch (ArrayIndexOutOfBoundsException exc)
{
}
return resultado;
}

}


Programación del botón:


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(null, jTextField1.getText());
Lexico app= new Lexico();
jTextField2.setText(app.comprueba(jTextField1.getText()));
}


Tarea

Hacer el atomata finito y programa de la siguiente expresion regular:

ER (_ letra) (letra numero _)*
Ademas debe aceptar palabras reservadas como el for, while do, break.




package Javaapplet2;

import javax.swing.JOptionPane;

/**
*
* @author Carlos Alfredo
*/
public class Lexico2 {
public String comprueba(String palabra)
{
String nuevacadena=palabra+ '%';
int tam=nuevacadena.length();
String resultado=null;

int mat [][]=new int [5][4];

// TABLA DE TRANSICIONES

// l N - FC
mat[1][0]=2; mat[1][1]=4; mat[1][2]=2; mat[1][3]=90;
mat[2][0]=3; mat[2][1]=3; mat[2][2]=3; mat[2][3]=100;
mat[3][0]=3; mat[3][1]=3; mat[3][2]=3; mat[3][3]=100;
mat[4][0]=4; mat[4][1]=4; mat[4][2]=4; mat[4][3]=90;


//comienza el ciclo, donde compara cada una de las letras de la palabra.
int x=0,y=0,z;

for(int i=0;i<1;i++) z="i;" z="z+1;" z="z+1;" x="1;" z="i;" z="z+1;" x="2;" z="i;" z="z+1;" z="z+1;" z="z+1;" z="z+1;" x="3;" k="k+1;}" z="i;" z="z+1;" z="z+1;" z="z+1;" z="z+1;" x="4;" ren="1," col="0;" y="0;" reng="1,colu=" i="0;i {

if(Character.isLetter(nuevacadena.charAt(i)))
{
colu=0;
reng=mat[reng][colu];
}
if(Character.isDigit(nuevacadena.charAt(i)))
{
colu=1;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='-')
{
colu=2;
reng=mat[reng][colu];
}

if(nuevacadena.charAt(i)=='%') //Marca el fin de cadena
{
nuevacadena=palabra;
colu=3;
if(mat[reng][colu]==100)
{
resultado= "Cadena Valida";
}
else
resultado= "Cadena Invalida";

}
}
}
}catch (ArrayIndexOutOfBoundsException exc)
{
}
return resultado;
}

}

Creacion del applet :

Programacion del boton:


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(null, jTextField1.getText());
Lexico2 app= new Lexico2();
jTextField2.setText(app.comprueba(jTextField1.getText()));
}





miércoles, 14 de octubre de 2009

Programa automata

Bueno aqui les dejo el codigo de un atomata, este solo lee palabras comenzadas con letras separadas por signos como el * y el +.


/*
* To change this template, choose Tools Templates
* and open the template in the editor.
*/

package automata;
import java.io.*;

/*
* @author Carlos Alfredo
*/

public class automata
{
public static void main(String args[]) throws IOException
{
String cadena;
String cadena2;

try
{

BufferedReader n=new BufferedReader(new FileReader("Palabra.txt")); //Aqui lee el archivo donde se almacena las palabras
while((cadena=n.readLine())!=null){
//cadena=n.readLine();
comprueba(cadena);
}

}
catch(FileNotFoundException e)
{
System.out.println("No se pudo leer el archivo");
}
}

public static void comprueba(String palabra)
{
String nuevacadena=palabra+ '%';
int tam=nuevacadena.length();

int mat [][]=new int [8][5];

// TABLA DE TRANSICIONES

// L N + * FC
mat[1][0]=2; mat[1][1]=2; mat[1][2]=4; mat[1][3]=4; mat[1][4]=90;
mat[2][0]=5; mat[2][1]=6; mat[2][2]=3; mat[2][3]=3; mat[2][4]=100;
mat[3][0]=2; mat[3][1]=2; mat[3][2]=7; mat[3][3]=7; mat[3][4]=90;
mat[4][0]=4; mat[4][1]=4; mat[4][2]=4; mat[4][3]=4; mat[4][4]=90;
mat[5][0]=5; mat[5][1]=5; mat[5][2]=5; mat[5][3]=5; mat[5][4]=90;
mat[6][0]=6; mat[6][1]=6; mat[6][2]=6; mat[6][3]=6; mat[6][4]=90;
mat[7][0]=7; mat[7][1]=7; mat[7][2]=7; mat[7][3]=7; mat[7][4]=90;

//comienza el ciclo, donde compara cada una de las letras de la palabra.
int reng=1,colu=0;
try
{
for(int i=0;i {
if(Character.isLetter(nuevacadena.charAt(i)))
{
colu=0;
reng=mat[reng][colu];
}
if(Character.isDigit(nuevacadena.charAt(i)))
{
colu=1;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='+')
{
colu=2;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='*')
{
colu=3;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='%') //Marca el fin de cadena
{
nuevacadena=palabra;
colu=4;
if(mat[reng][colu]==100)
{
System.out.print(nuevacadena+"\tCadena Valida\n");
}
else
System.out.print(nuevacadena+"\tCadena Invalida\n");
}
}
}catch (ArrayIndexOutOfBoundsException exc)
{
}
}
}