/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sdsimulator.runnable.expresiones;

/**
 *
 * @author Miguel Herreros
 */

public class ExpresionTokenizada{
    private static Operadores operadores= new Operadores();
    private String[] tokens;  //Contiene tokens en el mismo orden en el que aparecen en 
    //la expresión de entrada (notación infija)
    
    //..........................................................................
    public ExpresionTokenizada(String expresion){
        try{
            this.tokens            = tokenizar(expresion);
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
    //..........................................................................
    public String getToken(int i){
        return tokens[i];
    }
    //..........................................................................
    public int size(){
        return tokens.length;
    }
    //..........................................................................
    /** Devuelve un vector de Strings con todos los tokens en el mismo orden en 
     * que aparecen en el string (llamamos tokens tanto a los operadores como a
     * los nombres de variable (o constantes).
     * @param expresion
     * @return
     */
    private String[] tokenizar(String expresion){
        String expresionEspaciada = espaciar(expresion);
        String[] retorno;
        retorno = expresionEspaciada.split(" ");
        return  retorno;
    }
    //..........................................................................
    /**
     * Necesito transformar los operadores que haya en WST a los míos. 
     * Por ejemplo, not pasa a ser ¬
     * También nos aseguraremos de que ningún paréntesis u operador quede pegado 
     * a nada.
     * @param CadenaOriginal
     * @return
     */
    private String espaciar(String CadenaOriginal){
        String aux = CadenaOriginal;
        String operador;
        aux=aux.replace("not(","¬(");
        aux=aux.replace(" not ","¬");
        aux=aux.replace(")not ",")¬");
        aux=aux.replace("("," ( ");
        aux=aux.replace(")"," ) ");
        
        aux=aux.replace(">=","}"); //DAba problemas al espaciar por culpa de >
        aux=aux.replace("<=","{"); //Daba problemas al espaciar por culpa de <
        
        try{
            for (int i=0; i<operadores.size(); i++){
                operador=operadores.getOperador(i);
                aux=aux.replace(operador, " " + operador + " ");
            }
        }catch (Exception e){
            System.out.println(e.getMessage());
            return "";
        }
        
        while (aux.startsWith(" ")) //Si lo primero era un espacio, debe desaparecer.
            aux=aux.substring(1);
        //Otra opción sería usar el método trim de la clase String
        
        aux=aux.replaceAll(" +", " "); //deja un solo espacio en blanco. 
        //¡¡¡¡¡¡OJO!!!!!!El primer parámetro es una expresión regular.    
        
        return aux;
    }
    //..........................................................................
    public boolean isEmpty(){
        return (tokens.length==0);
    }
}