domingo, octubre 30, 2005

Ejemplo Generar Código Spim

Ejemplo Generar Código Spim

Utilizando gramáticas (cup) para realizar cálculos matemáticos (suma, resta, multiplicación, división) hemos de generar código que se pueda ejecutar en Spim (este código se almacena en un archivo compatible con el emulador Spim).
Primero construí una clase que me maneja los registros ($t0...$t9) que serán utilizados en Spim, luego dentro de la gramática y verificando que operación se este realizando se convierte la operación matemática en código Spim.

Ej.: si se esta verificando la expresión “2+5”, en código Spim seria “add $t0, $t1, $t2”, donde “$t0” guarda la suma de los dos números y “$t1, $t2” son los números respectivamente.

El manejador de registros cuanta con funciones tales como: obtener un registro libre y el de liberar una lista de registros. Para saber si existe disponible un registro la clase cuanta con dos estructuras (ArrayList), una estructura que mantiene un valor booleano (false indicando que esta disponible, true indicando que esta no disponible), la otra estructura mantiene la lista de registros ($t0...$t9). Al final si todo resulto bien obtendremos un archivo con el código que fue generado por la gramática el cual podremos ejecutar en Spim.

Nota: cuando liberamos registros se le manda un parámetro, el cual es un ArrayList. Este mantendrá los registros que han sido utilizados hasta el momento.

public class ClsRegistros {
    private ArrayList Free = new ArrayList();
    private ArrayList Reg = new ArrayList();
    
    public ClsRegistros() { }
    
    public void initReg() {
        Free.clear(); Reg.clear();
        for (int i=0;i<10;i++){
           Free.add( String.valueOf(false) );
           Reg.add("$t"+i);
        }        
    }    
    public String getFreeReg(){
        String freeReg="";
        for (int i=0;i<10;i++){
            if ( !Boolean.valueOf( Free.get(i).toString() ).booleanValue() ) {
                Free.set(i, String.valueOf(true));
                freeReg = Reg.get(i).toString();
                break;
            }
        }
        if ( freeReg=="" ) { System.out.println("No hay registros disponibles.");}
        return freeReg;
    }

    public void setFreeReg( ArrayList regs ) {
        for (int i=0;i<regs.size();i++) {
            int index = Reg.indexOf(regs.get(i));
            Free.set(index, String.valueOf(false));
        }
    }    
}

No hay comentarios.: