Para el evaluador usaremos los siguientes archivos:


Una vez comprendida la primera parte, que es la introduccion al Jlex, seguimos a este ejercicio mas complejo.

La Gramática del Evaluador de expresiones con orden de jerarquía en los Operadores es:

Expr -> Termino + Expr | Termino
Termino -> Factor  * Expr
Factor -> '('  Expr ')' | NUMERO
 

Este es el Parser Basados en las Instrucciones que ofrece el Libreo de Compiladores,
técnicas y herramientas (Alfred Aho).

public class FParser {
    private ScannerUtil lex = null;
 
    private String preanalisis;
 
    private String analex() throws Exception {
        if(lex.Next()){
          return lex.getText();
        } else{
          return "";
        }
    }
 
    private void parea(String txt) throws Exception{
        if (preanalisis!=null){
         if ( preanalisis.equals(txt) ){
            preanalisis = analex();
         } else {
            throw new Exception("Error de Sintaxis '"+ txt +"'");
         }
        }else{
            throw new Exception("Error EOF inesperado");
        }
    }
 
    private float Expr() throws Exception {
        //System.out.println("Expr->Termino");
        float resultado = Termino();
        boolean haga = true;
 
        while(haga){
            if  ( //Si vienen los siguientes Operadores
                  this.preanalisis.equals("+")  |
                  this.preanalisis.equals("-")
                ){
                 String operador = preanalisis;
                parea(preanalisis);
                  if ( operador.equals("+") ){
                      resultado = resultado  + Termino();
                  }
 
                  if ( operador.equals("-") ){
                      resultado = resultado  - Termino();
                  }
 
            }else{
                haga = false;
            }
        }
 
        return resultado;
    }
 
 
    private float Termino() throws Exception {
        //System.out.println("Termino->Factor");
        float resultado = Factor();
        boolean haga = true;
 
        while(haga){
            if  ( //Si vienen los siguientes Operadores
                  this.preanalisis.equals("*")  |
                  this.preanalisis.equals("/")  |
                  this.preanalisis.equals("%")
                ){
                 String operador = preanalisis;
                parea(preanalisis);
                  if ( operador.equals("*") ){
                      resultado = resultado  * Factor();
                  }
 
                  if ( operador.equals("/") ){
                      resultado = resultado  / Factor();
                  }
 
                  if ( operador.equals("%") ){
                      resultado = resultado  % Factor();
                  }
 
            }else{
                haga = false;
            }
        }
 
        return resultado;
    }
 
    private float Factor() throws Exception {
        float resultado = 0;
        if (this.preanalisis.equals("(") ){
            parea("(");
                resultado = Expr();
            parea(")");
            return resultado;
        } else {
            if ( lex.getId() == Yytoken.Numero ){
                resultado = Float.parseFloat(preanalisis);
                preanalisis = analex();
                return resultado;
            } else{
                throw new Exception("Error de sintaxis FACTOR::'"+preanalisis+"'");
            }
        }
 
    }
 
    private float total = 0;
 
    public float getValor(){
        return total;
    }
 
    void Inicio(ScannerUtil lexema) throws Exception {
        lex = lexema;
        preanalisis = analex();
        float resultado = Expr();
        total = resultado;
        //System.out.println("resultado es :" + resultado);
    }
}