You are on page 1of 4

/** Elaboracion del patron de diseo Interpreter por el quipo BugoSystems

*
**********
El cdigo fuente de la clase Expresion aparece a continuacin. La parte relativa a la
evaluacin se limita a la declaracin de la firma del mtodo evalua.
Los mtodos siguientePieza, analiza y parsea estn dedicados al anlisis sintctico. El
mtodo analiza se utiliza para parsear una expresin entera mientras que parsea est
dedicado al anlisis bien de una palabra-clave o bien de una expresin escrita entre
parntesis.
**/
public abstract class Expresion{
public abstract boolean evalua(String descripcion);
// parte anlisis sintctico
protected static String fuente;
protected static int indice;
protected static String pieza;
protected static void siguientePieza(){
while ((indice < fuente.length()) && (fuente.charAt(indice) == ))
indice++;
if (indice == fuente.length())
pieza = null;
else if ((fuente.charAt(indice) == () ||(fuente.charAt(indice) == ))){
pieza = fuente.substring(indice, indice +1);
indice++;
}else{
int inicio = indice;
while ((indice < fuente.length()) && (fuente.charAt(indice) != ) &&
(fuente.charAt(indice) != )))
indice++;
pieza = fuente.substring(inicio, indice);
}
}
public static Expresion analiza(String fuente) throwsException{
Expresion.fuente = fuente;
indice = 0;
siguientePieza();
return OperadorO.parsea();
}
public static Expresion parsea() throws Exception{
Expresion resultado;
if (pieza.equals("(")){

siguientePieza();
resultado = OperadorO.parsea();
if (pieza == null)
throw new Exception("Error de sintaxis");
if (!pieza.equals(")"))
throw new Exception("Error de sintaxis");
siguientePieza();
}
else
resultado = PalabraClave.parsea();
return resultado;
}
}
/*La clase abstracta OperadorBinario gestiona los enlaces hacia los dos operandos del
operador.
*/
public abstract class OperadorBinario extends Expresion{
protected Expresion operandoIzquierdo, operandoDerecho;
public OperadorBinario(Expresion operandoIzquierdo,Expresion operandoDerecho){
this.operandoIzquierdo = operandoIzquierdo;
this.operandoDerecho = operandoDerecho;
}
}
/*La clase concreta OperadorO implementa el mtodo evalua y gestiona el anlisis de untrmino.*/
public class OperadorO extends OperadorBinario{
public OperadorO(Expresion operandoIzquierdo,Expresion operandoDerecho){
super(operandoIzquierdo, operandoDerecho);
}
public boolean evalua(String descripcion){
return operandoIzquierdo.evalua(descripcion) || operandoDerecho.evalua(descripcion);
}
// parte anlisis sintctico
public static Expresion parsea() throws Exception{
Expresion resultadoIzquierdo, resultadoDerecho;
resultadoIzquierdo = OperadorY.parsea();
while ((pieza != null) && (pieza.equals("o"))){
siguientePieza();
resultadoDerecho = OperadorY.parsea();
resultadoIzquierdo = new OperadorO(resultadoIzquierdo,
resultadoDerecho);
}
return resultadoIzquierdo;
}
]
/*La clase concreta OperadorY implementa el mtodo evalua y gestiona el anlisis

sintctico de un factor.*/
public class OperadorY extends OperadorBinario{
public OperadorY(Expresion operandoIzquierdo,Expresion operandoDerecho){
super(operandoIzquierdo, operandoDerecho);
}
public boolean evalua(String descripcion){
return operandoIzquierdo.evalua(descripcion) &&
operandoDerecho.evalua(descripcion);
}
// parte anlisis sintctico
public static Expresion parsea() throws Exception{
Expresion resultadoIzquierdo, resultadoDerecho;
resultadoIzquierdo = Expresion.parsea();
while ((pieza != null) && (pieza.equals("y"))){
siguientePieza();
resultadoDerecho = Expresion.parsea();
resultadoIzquierdo = new OperadorY(resultadoIzquierdo,resultadoDerecho);
}
return resultadoIzquierdo;
}
}
/**
*A continuacin se muestra el cdigo fuente de las subclases de Expresion. En primer
*lugar la clase concreta PalabraClave cuyo mtodo evalua busca la palabra-clave en la
*descripcin. Esta clase gestiona a su vez el anlisis sintctico de la palabra-clave.
*
*/
public class PalabraClave extends Expresion{
protected String palabraClave;
public PalabraClave(String palabraClave){
this.palabraClave = palabraClave;
}
public boolean evalua(String descripcion){
return descripcion.indexOf(palabraClave) != -1;
}
// parte anlisis sintctico
public static new Expresion parsea() throws Exception{
Expresion resultado;
resultado = new PalabraClave(pieza);
siguientePieza();
return resultado;
}
}

/*Por ltimo, la clase Usuario implementa el programa principal.*/


import java.util.*;
public class Usuario{
public static void main(String[] args){
Expresion expresionConsulta = null;
Scanner reader = new Scanner(System.in);
System.out.print("Introduzca su consulta: ");
String consulta = reader.nextLine();
try{
expresionConsulta = Expresion.analiza(consulta);
}catch (Exception e){
System.out.println(e.getMessage());
expresionConsulta = null;
}
if (expresionConsulta != null){
System.out.print("Introduzca la descripcin de un vehculo: ");
String descripcion = reader.nextLine();
if (expresionConsulta.evalua(descripcion))
System.out.print("La descripcin responde a la consulta");
else
System.out.print("La descripcin no responde a la consulta");
}
}
}

You might also like