Clase 12 Codigo Intermedio
Clase 12 Codigo Intermedio
Informática
CODIGO INTERMEDIO
x = y op z
t1 = 2 * a
t2 = b – 3
t3
t 3 = t1 + t2
+
t1 t2
-
*
2 a b 3
EJEMPLO
Para a=b+c*d El generador de código
intermedio, tratar de
dividir esta expresión en
sub-expresiones y, a
continuación, generar el
código correspondiente.
r1 = c * d
r2 = b + r1
r3 = r2 + r1
a = r3
EXPRESIVIDAD
Saltos condicionales
El conjunto de proposiciones
(operadores) debe ser lo Saltos
suficientemente rico como
incondicionales
para poder implantar las
operaciones del lenguaje
fuente Llamadas a
funciones
Las proposiciones de 3-
direcciones van a ser en bucles
cierta manera análogas al
código ensamblador.
TIPOS DE CODIGO
Un código de dirección tiene un
máximo de tres direcciones para
calcular la expresión. Un código
de dirección puede estar
representado en dos formas :
cuádruples y triples
cuadruplos
Código de tres
direcciones
tripletes
CUADRUPLOS
Un cuádruplo es una estructura tipo
registro con cuatro campos que se
llaman (op, result, arg1, arg2). El campo
op contiene un código interno para el
operador.
a = b + c * d;
0 * c d
1 + b (0)
2 + (1) (0)
3 = (2)
FORMAS UTILIZADAS
1. Proposiciones de la forma x = y op z
donde op es un operador binario
aritmético, lógico o relacional.
2. Instrucciones de la forma x = op y,
donde op es un operador unario
(operador negación lógico, menos
unario, operadores de
desplazamiento o conversión de
tipos).
t1 = 0
t2 = t1 x D1 + i
t3= t2 x D2 + j
t4 = t3 x D3 + k
t5 = dirbase [ t4 x tam(tipo) ]
Para una matriz entera MAT[3][5]
b=MAT[2] [1]
MAT 0 1 2 3 4
t1=0 0 2 4 6 8
0
t2= t1x3+2 = 2 1 10 12 14 16 18
t3= t2x5 +1 =11 2
20 22
b= MAT[11*2]
FORMAS UTILIZADAS
Para los procedimientos y retornos
se implementan mediante el uso
de las siguientes instrucciones:
Para su uso se da
como una secuencia
func inicio inicio de función
de instrucciones
func fin fin de función
param x1
param x2
call p, n Para las llamadas …..
y = call p, n a procedimientos y param xn
funciones p call p, n
return y
return
y representa a un valor
de retorno, es opcional
FORMAS UTILIZADAS
Asignaciones de direcciones a punteros
de la forma:
a -
a+a*(b-c)+(b-c)*d
b c
ARBOLES SINTACTICOS
Pasos para construir el árbol dirigido
+
P1=hoja(id, entrada a)
P2=hoja(id, entrada a)=p1 + *
P3=hoja(id, entrada b)
P4=hoja(id, entrada c)
P5=nodo(-, p3,p4) * d
P6=nodo(*, p1,p5)
P7=nodo(+, p1,p6)
P8=hoja(id, entrada b)=p3
P9=hoja(id, entrada c)=p4 a -
P10=nodo(-, p3, p4)=p5
P11=hoja(id, entrada)
P12=nodo(*, p5, p11)
P13=nodo(+, p7,p12)
b c
ARBOLES SINTACTICOS
a+a*(b-c)+(b-c)*d
p13
+
p7 p12
P1=hoja(id, entrada a)
P2=hoja(id, entrada a)=p1 + *
P3=hoja(id, entrada b)
P4=hoja(id, entrada c) p6 p11
P5=nodo(-, p3,p4) * d
P6=nodo(*, p1,p5)
P7=nodo(+, p1,p6)
P8=hoja(id, entrada b)=p3
P9=hoja(id, entrada c)=p4 a - p5=p10
P10=nodo(-, p3, p4)=p5 P1 = p2
P11=hoja(id, entrada)
P12=nodo(*, p5, p11)
P13=nodo(+, p7,p12)
b c
p3=p8 p4=p9
USO
G=(VN , VT , P, S)
VN ={ S, E } VT = { :=, id, (, ), num }
P= { S id := E ATRIBUTOS
E E1 + E2
E ( E1 ) Cada no-terminal tiene
E id dos atributos:
E num }
ATRIBUTO DESCRIPCION
E. dir nombre temporal que contendra el valor
de E, (t1 , t2 , …).
E E1 + E2 E.dir = nuevotemp();
E.cod= E1.cod//. E2 cod//
cod=‘t1=x+3’ cod=‘ ‘
{E.dir = E1.dir + E2.dir}
dir=t1 E + E
dir=4
E (E1) E.dir = E1.dir
E.cod = “ ”
cod=‘ ‘ cod=‘ ‘
E id E.dir = lexema(id)
E.cod= “ ”
E + E dir=3 num
dir=x
(4)
Enum E.dir = lexema(num);
E.cod = “ ” id num
(x) (3)
EJERCICIO
int a, b ;
float c;
inicio
a =2;
b= 5;
c= a * b + (a + a);
fin