Codigo de Tres Direcciones Arreglos

miércoles, 9 de septiembre de 2009
Un saludo a todos de nuevo en esta publicacion generaremos una definicion dirigida por la sintaxis para lo que son arreglos, pero para hacerlo un poco mas amplio sera para arreglos de arreglos, con un maximo de dos dimensiones, para la sentencias de asignacion

NOTA: seguimos asumiendo que la traduccion de EXP para representaciones numericas ya la tenemos, aunque en esta gramatica agregaremos la parte de los arreglos.
Los bloques de los arreglos los tomaremos como filas y luego columnas. Array[f, c]

ASIG := ID '=' EXP {: write(ID, ' = ', EXP1.cad); :}
| ID {: DIM.id = ID; :} DIM '=' EXP {: write(ID, '[', DIM1.cad, '] = ', EXP1.cad); :}
DIM :=
{: DIM.id = DIM.id :} DIM '[' {: AR.id = DIM1.id :} AR ']' {: write('T', contTemp, '=', DIM1.cad, '- 1');
contTemp++;
write('T', contTemp, '= T', contTemp - 1, '*', tamanioBloque(id, 2); //metodo que devuelve el tamanio del primer bloque
contTemp++;
write('T', contTemp, '= T', contTemp - 1, '+', AR1.cad);
DIM.cad = concat('T', contTemp);
contTemp++;
:}
| '[' AR ']' {: DIM.cad = AR1.cad:}
AR := {: AR.id = AR.id; :} AR , EXP {: write('T', contTemp, '=', AR1.cad, '- 1');
contTemp++;
write('T', contTemp, '= T', contTemp - 1, '*', tamanioBloque(id, 1);//metodo que devuelve el tamanio de las filas
contTemp++;
write('T', contTemp, '= T', contTemp - 1, '+', EXP1.cad);
AR.cad = concat('T', contTemp);
contTemp++;
:}
| EXP {: AR.cad = EXP1.cad:}
EXP := EXP '*' EXP

| EXP '/' EXP
| EXP '+' EXP
| EXP '-' EXP
| '(' EXP ')'
| NUMERO
| ID
| ID
{: DIM.id = ID; :} DIM {:write('T', contTemp, '=', ID, '[', DIM1.cad, ']');
EXP.cad = concat('T', contTemp);
contTemp++; :}

0 comentarios: