Вы находитесь на странице: 1из 9

Componentes Principales de la Aplicacin

Clase: Metodos

Clase: smbolo
Esta clase contiene los atributos de un smbolo, e indica si es inicial o terminal y el nombre
de cada smbolo, Teniendo en cuenta cada get y set indicado. Tambin se agregan las
producciones y se agregan transiciones para cada produccin.
Clase: Produccin
Esta clase contiene los atributos de una produccin, como lo son el smbolo, con sus
respectivos mtodos set y get, agrega transiciones, se crea la produccin y le pasa el estado
destino y la etiqueta de transicin
Clase: Gramtica
Esta es la clase es una de las ms importante, la cual usa las clases smbolo y Produccin
para la construccin de la gramtica, compuesta de los mtodos y funciones ms esenciales
de la aplicacin, en esta se definen las restricciones y condiciones que debe cumplir el
sistema.

Descripcin de las Estructuras de Datos Utilizadas


Esta Aplicacin est construida en base a estructuras de datos dinmicas y estticas como
se describe a continuacin, hemos aprovechado las ventajas que nos brinda la programacin
orientada a objetos para optimizar el reconocimiento de cadenas y generar gramticas
usando exclusivamente una base terica del comportamiento general de los mismos.

Vectores de Objetos.
public class Simbolo
private Produccion Producciones[ ]=new Produccion[0];

private void AgregarProduccion(){ // agrega Producciones


if(Terminal==false){
if(Producciones!=null){
int n=Producciones.length+1;
Produccion aux[]=new Produccion[n];
for(int i=0;i<n-1;i++){
aux[i]=Producciones[i];
}
aux[n-1]=new Produccion();
Producciones=aux;
System.out.println("Preparando");
}else{
Producciones=new Produccion[1];
Producciones[0]=new Produccion();
}
}
}

public class Produccion

private Simbolo[] cadena = null;


public boolean set(String regla, boolean terminales[]){
if(regla.length()==terminales.length){
cadena= new Simbolo[regla.length()];
for(int i=0;i<regla.length();i++){
cadena[i]=new Simbolo();
cadena[i].setNombre(""+regla.charAt(i));
cadena[i].setTerminal(terminales[i]);
System.out.println("Simbolo: "+cadena[i].getNombre()+"
"+cadena[i].esTerminal());
}
this.Concat();
System.out.println("Produccion Creada : "+Regla);
return true;
}else{
System.err.println("Datos Inconsistentes!");
}
return false;
}

private void AgregarSimbolo(){ // agrega Producciones


if(cadena!=null){
int n=cadena.length+1;
Simbolo aux[]=new Simbolo[n];
for(int i=0;i<n-1;i++){
aux[i]=cadena[i];
}
aux[n-1]=new Simbolo();
cadena=aux;
}else{
cadena=new Simbolo[1];
cadena[0]=new Simbolo();
}
}

public class Gramatica


private Simbolo[ ] simbolos=null;

private void AgregarSimbolo(){ // para agregar un simbolo vacio al


gramatica
if(simbolos!=null){ // si el vector original NO es nulo

int n=simbolos.length+1;
Simbolo aux[]=new Simbolo[n]; // se hace un vector auxiliar con
espacio mas
for(int i=0;i<n-1;i++){
aux[i]=simbolos[i]; // se copian los simbolos viejos al vector
auxiliar
}
aux[n-1]=new Simbolo(); // se agrega uno vacio al final
simbolos=aux; //se remplaza el vector viejo por el auxiliar

}else{ // si el vector original es nulo

simbolos=new Simbolo[1]; // se crea el vector con solo una


posicion
simbolos[0]=new Simbolo(); // se agrega un simbolo vacio
}
}

Mtodos de Reconocimiento

Public Simbolo getSimboloInicial(){ // se busca el simbolo inicial

for(int i=0;i<simbolos.length;i++){ //recorre los simbolos


if(simbolos[i].esInicial()){ // si el simbolo actual es un simbolo final
return simbolos[i]; // devuelva ese simbolo

Public boolean setSimboloTerminal(String Nombre){ // establecer simbolo inicial


(solo puede existir 1)
Simbolo simbolo=this.getSimbolo(Nombre); // se busca el simbolo

if(simbolo!=null){ // si el simbolo existe


simbolo.setTerminal(true); // se establece como terminal
return true; // se establecio como terminal
}else{
System.err.println("No existe el Simbolo");
}

return false; // no se pudo establecer


}

Private void AgregarSimbolo(){ // para agregar un simbolo vacio al gramatica

if(simbolos!=null){ // si el vector original NO es nulo

int n=simbolos.length+1;
Simbolo aux[]=new Simbolo[n]; // se hace un vector auxiliar con espacio mas
for(int i=0;i<n-1;i++){
aux[i]=simbolos[i]; // se copian los simbolos viejos al vector auxiliar
}
aux[n-1]=new Simbolo(); // se agrega uno vacio al final

simbolos=aux; //se remplaza el vector viejo por el auxiliar

}else{ // si el vector original es nulo

simbolos=new Simbolo[1]; // se crea el vector con solo una posicion


simbolos[0]=new Simbolo(); // se agrega un simbolo vacio

}
}

public boolean AgregarNuevoSimbolo(String NombreSimbolo){ // agregar nuevo simbolo

boolean encontrado=false; //variable encotrado, si es false no ha encontrado, si es true


si se encontro
if(simbolos!=null){
Simbolo buscado=this.getSimbolo(NombreSimbolo);
if(buscado!=null){ // si no es nulo
encontrado=true; // entonces si lo encontro
}
}
if(encontrado==false){ // si no lo encontro
this.AgregarSimbolo(); // agrega un simbolo vacio
simbolos[simbolos.length-1].setNombre(NombreSimbolo); // se le pone el nombre al
simbolo agregado
return true; // Se agreg el smbolo correctamente
}else{
System.err.println("Ya existe un simbolo llamado '"+NombreSimbolo+"' ");

return false; // No se pudo agregar el simbolo


}

Public boolean GenerarCadena(){ // Esta Genera las cadenas

String subcadena="";
Simbolo inicial=this.getSimboloInicial();
if(inicial!=null){
System.out.println("Generando Cadena");
if(inicial.getProducciones()!=null){
Produccion P[]=inicial.getProducciones();
subcadena=P[this.getPosicionAleatoria(P.length)].getRegla();
while(this.contieneNoTerminales(subcadena)){
String nombresimbolo;
Simbolo S;
for(int i=0;i<subcadena.length();i++){
nombresimbolo=""+subcadena.charAt(i);
S=this.getSimbolo(nombresimbolo);
if(S!=null){
if(S.esTerminal()==false){
P=S.getProducciones();
if(P!=null){
subcadena=subcadena.replace(nombresimbolo,P[this.getPosicionAlea
toria(S.getProducciones().length)].getRegla());
}
}

}
}

}
CadenaGenerada=subcadena;

}else{
return false;
}
}

System.out.println(CadenaGenerada+"\n");
return true;
}

Вам также может понравиться