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++; :}
Codigo de Tres Direcciones Arreglos
Etiquetas:
COMPILADORES
Publicado por
Elder Alexander Prado Herrera
miércoles, 9 de septiembre de 2009
Suscribirse a:
Enviar comentarios (Atom)
0 comentarios:
Publicar un comentario