Generación de Código Intermedio Ejemplo de generacion de C.I. para los constructores t´ıpicos de los lenguajes de programacion. (1) Lenguaje Intermedio: Instruccion de asignacion: ”a := b” ; (:=,b, ,a) Operadores binarios: ”x := a OP b” ; (OP,a,b,x) • Op. aritm´eticos 8>>><>>>: Reales +R ADDF −R SUBF ∗R MULF /R DIVF Enteros +E ADDI −E SUBI ∗E MULI /E DIVI • Op. booleanos8<: && AND k OR ⊕ XOR • Op. relacionales8<: > GT ≤ LE < LT ≥ GE = EQ 6= NE Operadores unarios: ”x := OP a” ; (OP,a, ,x) • Cambio signo: − MINUS • Conversi´on tipos CONVF (convierte int a float) CONVI (convierte float a int) • L´ogicos8<: ∼ NOT ≫ SHFR ≪ SHFL Saltos • Incondicional: ”goto etq” ; (goto,etq, ) • Condicional: ”if x goto etq” ; (if,x,etq, ) Si x es true salta a etq. Adem´as, saltos con ops. relacionales (>, <, ==, etc..) ”if x > y goto etq” ; (if GT,x,y,etq) • Declaraci´on etiquetas: ”etq: <…>” ; (label,etq, , ) Etiqueta ”etq” estar´a asociada a la siguiente instrucci´on. Llamadas a procedimiento Llamada al procedimiento proc(x1, x2, …, xN, con n argumentos. PARAM x1 PARAM x2 … PARAM xN call proc, N Fin llamada a procedim.: ”return valor” ; (return, valor, , ) Acceso a memoria • Acceso indirecto: ”x := y[i]” ; (:=[],y,i,x) (acceso) ”x[i] := y” ; ([]:=,y,i,x) (asignaci´on) ”a[j]” = posici´on de memoria j unidades (bytes/palabras) despu´es de la direcci´on de a. x[10] := a+b temp100 := a+b x[10] := temp100 • Punteros: ”x := &y” (asigna a x la direcci´on de y) ”x := *y” (asigna a x el contenido apuntado por la dir. guardada en y) ”*x := y” (guarda en la dir. guardada en la var. x el valor de y) (2) Suposiciones: Mantendremos el cod. generado en un atributo asociado a los s´ımbolos de la gram´atica 1 TDS por bloque + 1 TDS asociada a cada tipo registro Contenido entradas TDS • Informaci´on de direccionamiento: posici´on relativa (offset) respecto al inicio del ´area de datos del bloque de c´odigo actual → variables locales se sit´uan consecutivamente seg´un orden de declaraci´on • Tama˜no de las variables: char: 1 real: 8 record: P tama˜no campos int: 4 puntero:4 array : tama˜no elementos × num. elementos Etiquetas: asociadas a una instrucci´on del lenguaje intermedio → se refieren a direcciones de memoria de la zona de instrucciones Temporales: dir. de memoria destinadas al almacenamiento de valores intermedios → al generar cod. objeto se decidir´a si se refieren a registro o una pos. de memoria (3) Atributos dir: referencia a la direcci´on en memoria/registro asociada a un identificador(variable) o a un temporal → todo no terminal de la gram´atica usado en expresiones tendr´a asociada siempre una var. temporal c´odigo: guarda el C.I.(lista de cuartetos o tercetos) generado para una construcci´on del lenguaje Funciones Se supondr´a que est´an definidas las dos funciones siguientes crearTemporal(): genera una nueva variable temporal generarCI(instruccion): genera la representaci´on en CI de una instrucci´on de 3 direcciones nuevaEtiqueta(): genera una nueva etiqueta