Elaboracion Del Patron de Diseño Interpreter Por El Quipo BugoSystems

4
/** Elaboracion del patron de diseño Interpreter por el quipo BugoSystems * ********** El código fuente de la clase Expresion aparece a continuación. La parte relativa a la evaluación se limita a la declaración de la firma del método evalua. Los métodos siguientePieza, analiza y parsea están dedicados al análisis sintáctico. El método analiza se utiliza para parsear una expresión entera mientras que parsea está dedicado al análisis bien de una palabra-clave o bien de una expresión escrita entre paréntesis. **/ public abstract class Expresion{ public abstract boolean evalua(String descripcion); // parte análisis sintáctico 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("(")){

description

jjj

Transcript of Elaboracion Del Patron de Diseño Interpreter Por El Quipo BugoSystems

  • /** 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");

    }

    }

    }