Вы находитесь на странице: 1из 27

Diseo de

Compiladores I
G E N E RA C I N D E C D I G O S E N T E N C I A S D E C O N T R O L
ING. TOMMASEL ANTONELA

Cmo pasamos del cdigo fuente al cdigo mquina?

if (a > 0) then
k := k*5;
else
j := j-3;

MOV R1, a
CMPL R1, 0
BF label_1
MOV R1, k
MUL R1, 5
BI label_2
label_1
MOV R1, j
SUB R1, 3
label_2

Fases de la Compilacin
Errores

Program
a Fuente

Anlisis
Lxico

Tira
de
Tokens

Anlisis
Sintctico

Tabla de
Smbolos

Lista
de
Reglas

Generacin
de Cdigo

Salida

Grafo de Generacin de Cdigo


Sentencias Ejecutables

Tercetos

Lista de
Reglas

rbol
Sintctic
o

Cuartet
os

Cdigo
Assembl
er

Polaca
Inversa
Mquina
de Pila

Grafo de Generacin de Cdigo


Sentencias Ejecutables

Tercetos

Lista de
Reglas

rbol
Sintctic
o

Polaca
Inversa

Cdigo
Assembl
er

Representacin Intermedia
Polaca Inversa

Terceto
s

Operadores Binarios:
op1 operador op2
op1 op2 operador

Polaca
Inversa

Operadores Unarios:
operador op1
op1 operador

x := y + z

Ventajas:
Desarrollo rpido.
Compilador relativamente rpido.
Ejecutable relativamente bueno.

Cdigo
Assembl
er

rbol
Sintctic
o

Lista de
Reglas

:=

Representacin Intermedia
Tercetos

Representacin constituida por cdigos de 3


direcciones:
( operador, op1, op2 )
En el caso de operadores unarios:
( operador, op1, -)

Terceto
s
Lista de
Reglas

rbol
Sintctic
o
Polaca
Inversa

x := y + z
1. ( + , y , z )
2. ( := ,x , [1] )

Cdigo
Assembl
er

Representacin Intermedia
rbol Sintctico

Terceto
s

Es una representacin comprimida del rbol


de parsing.
Permite el pasaje a cualquiera de las otras
representaciones:
Inorden Cdigo original
Postorden Polaca Inversa
Preorden Tercetos

Cdigo
Assembl
er

rbol
Sintctic
o

Lista de
Reglas

Polaca
Inversa

x := y + z
:
=
x

+
y

Sentencias de Control - Ejemplos

Seleccin
if (a > 0) then
k := k*5;
else
j := j-3;

<SELECCION>
IF <CONDICION> THEN <BLOQUE> ELSE
<BLOQUE>

Iteracin
while (a > 0)
{
k := k*5;
j := j-3;
}

<ITERACION>
WHILE <CONDICION> <BLOQUE>

Sentencias de Control
Gramtica Reducida

<SELECCION> IF <CONDICION> THEN <BLOQUE> ELSE <BLOQUE>


<ITERACION> WHILE <CONDICION> <BLOQUE>
<CONDICION> ( <EXPRESION_LOGICA> )
<EXPRESION_LOGICA> <EXPRESION> <SIGNO> <EXPRESION>
<SIGNO> < | > | <= | >= | !=
<BLOQUE> := <SENTENCIA> | { <SENTENCIAS> }
<SENTENCIAS> <SENTENCIAS> <SENTENCIA> | <SENTENCIA>
<SENTENCIA> <SELECCION> | <ITERACION> | <ASIGNACION> ;
<EXPRESION> <EXPRESION> + <TERMINO> | <EXPRESION> - <TERMINO> |
<TERMINO>
<TERMINO> <TERMINO> * <FACTOR> | <TERMINO> / <FACTOR> | <FACTOR>
<FACTOR> <ID> | <DIGITO>

Sentencias de Control - Seleccin

SELECCION> IF <CONDICION> THEN <BLOQUE> ELSE <BLOQUE>

TERMINA LA EVALUACIN DE LA CONDICIN.


Debe generarse el salto por falso (BF).
Todava no se conoce la direccin a donde se va a saltar. Se tiene una
incompleta.
FINdireccin
DEL BLOQUE
THEN.

Debe generarse el salto incondicional (BI) al final de la seleccin.


Se est en posicin de conocer la direccin del BF.

FIN DEL BLOQUE ELSE.

Se termin de reconocer la sentencia de seleccin.


Se est en posicin de conocer la direccin del BI.

MOV R1, a
CMPL R1,
0
BF
label_1
MOV R1, k
MUL R1, 5
BI
label_2
label_1
MOV R1, j
SUB R1, 3
label_2

Sentencias de Control - Seleccin


<SELECCION> IF <CONDICION> THEN <BLOQUE> ELSE <BLOQUE>

<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE


<BLOQUE_ELSE>
<SELECCION> := IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE
<BLOQUE_ELSE>
<CONDICION_IF> := <CONDICION>
<BLOQUE_THEN> := <BLOQUE>
<BLOQUE_ELSE> := <BLOQUE>

Seleccin Polaca Inversa


<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE
<BLOQUE_ELSE>
1

TERMINA LA EVALUACIN DE LA CONDICIN. (Generar BF)


1

1. Crear espacio en blanco


2. Apilar la direccin del paso incompleto.
3. Crear el paso del BF.

FIN DEL BLOQUE THEN. (Se conoce la direccin destino del BF y necesita un
BI)
2

1.
2.
3.
4.

Desapilar la direccin del paso incompleto y completar con #_paso_actual + 2(*)


Crear espacio en blanco.
Apilar la direccin del paso incompleto.
Crear el paso del BF.

FIN DEL BLOQUE ELSE. (Se conoce la direccin destino del BI)
1. Desapilar la direccin del paso incompleto.
2. Completar con #_paso_actual + 1.

Seleccin Polaca Inversa


Acciones Semnticas

<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE


2
1
<BLOQUE_ELSE>
REGLAS DE LA GRAMTICA
<SELECCION> IF <CONDICION_IF> THEN

3 <BLOQUE_THEN> ELSE <BLOQUE_ELSE>

ACCIONES SEMNTICAS
#_paso_incomp = desapilar_paso();

//Desapila direccin

incompleta.

completar_paso(#_paso_incomp, #_paso_actual + 1);


//Completa el destino de BI.

1 <CONDICION_IF> <CONDICION>

#_paso_actual = create_paso( ); //Crea paso incompleto.


apilar_paso(#_paso_actual); //Apila el nmero del paso
incompleto.

<BLOQUE_THEN> <BLOQUE>

#_paso_actual = create_paso(BF);

//Crea el paso BF.

#_paso_incomp = desapilar_paso();

//Desapila direccin

incompleta.

completar(#_paso_incomp , #_paso_actual + 2);

//Completa

el destino de BF.

#_paso_actual = create_paso( ); //Crea paso incompleto.


apilar_paso(#_paso_actual); //Apila el nmero del paso
incompleto.

#_paso_actual = generar_paso(BI);

//Se crea el paso BI.

Seleccin Polaca Inversa

if (a > 0) then
k := k*5;
else
j := j-3;

Ejemplo

>

13

BF

:=

10

18

BI

:=

11

12

13

14

15

16

17

18

Seleccin Tercetos
<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE
<BLOQUE_ELSE>
1

TERMINA LA EVALUACIN DE LA CONDICIN. (Generar BF)


1

1. Crear el tercero incompleto correspondiente al BF.


2. Apilar el nmero de terceto incompleto.

FIN DEL BLOQUE THEN. (Se conoce la direccin destino del BF y necesita un
BI)
1. Desapilar el nmero de terceto incompleto (BF) y completar con DIR_ACTUAL+2 (*)
2. Crear terceto incompleto (BI).
3. Apilar el nmero de terceto incompleto.

FIN DEL BLOQUE ELSE. (Se conoce la direccin destino del BI)
1. Desapilar el nmero del terceto incompleto (BI).
2. Completar con DIR_ACTUAL+1.

Seleccin Tercetos
Acciones Semnticas

<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE


2
1
<BLOQUE_ELSE>
REGLAS DE LA GRAMTICA
3 <SELECCION> IF <CONDICION_IF> THEN
<BLOQUE_THEN> ELSE <BLOQUE_ELSE>

1 <CONDICION_IF> <CONDICION>

ACCIONES SEMNTICAS
#_terc_incomp = desapilar_terceto();
completar_terceto(#_terc_incomp, #_terc_actual + 1);
//Completa el terceto BI.

#_terc_actual = crear_terceto(BF,Cond.prt, [?] ); //Crea un


terceto incompleto.

apilar_terceto(#_terc_actual);

//Apila el nmero del terceto

incompleto.

<BLOQUE_THEN> <BLOQUE>

#_terc_incomp = desapilar_terceto();
completar_terceto(#_terc_incomp, #_terc_actual + 2);
//Completa el terceto BF.

#_terc_actual = crear_terceto(BI, [?], -);

//Crea un terceto

incompleto.

apilar_terceto(#_terc_actual);
incompleto.

<BLOQUE_ELSE> <BLOQUE>

//Apila el nmero del terceto

Seleccin Tercetos
Ejemplo

1.(
2.(
3.(
4.(
5.(
6.(
7.(

< , a , 0 )
BF , [1], 6 )
* , k , 5 )
:= , k , [3] )
BI , 8 , -- )
- , j , 3 )
:= , j , [6] )

if (a > 0) then
k := k*5;
else
j := j-3;

Seleccin rbol Sintctico


<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE
<BLOQUE_ELSE>
1

1
2

TERMINA LA EVALUACIN DE LA CONDICIN. (Generar BF)


1. Crear el nodo correspondiente a la condicin evaluada.

FIN DEL BLOQUE THEN. (Se conoce la direccin destino del BF y necesita un
BI)
1. Crear el nodo correspondiente al bloque THEN. (Apuntando a bloque de
sentencias correspondiente).
1. Crear el nodo correspondiente al bloque ELSE (Apuntando a bloque de sentencias
correspondiente).
2. Crear el nodo correspondiente al cuerpo del IF (Apuntando a los nodos del bloque
THEN y ELSE).
3. Crear el nodo correspondiente al IF (Apuntando al nodo de la condicin y del
cuerpo).

FIN DEL BLOQUE ELSE. (Se conoce la direccin destino del BI)
3

Seleccin rbol Sintctico


Acciones Semnticas

<SELECCION> IF <CONDICION_IF> THEN <BLOQUE_THEN> ELSE


2
1
<BLOQUE_ELSE>

REGLAS DE LA GRAMTICA
3 <SELECCION> IF <CONDICION_IF> THEN
<BLOQUE_THEN> ELSE <BLOQUE_ELSE>

Cuerpo_IF.ptr = crear_nodo(cuerpo, Bloque_then.ptr,


Bloque_else.ptr);
IF.ptr = crear_nodo(IF, Cond_IF.ptr, Cuerpo_IF.ptr);

<CONDICION_IF> <CONDICION>

Cond_IF.ptr = crear_nodo(cond, Cond.ptr, null);

<BLOQUE_THEN> <BLOQUE>

Bloque_Then.ptr = crear_nodo (then, Bloque.ptr, null);

<BLOQUE_ELSE> <BLOQUE>

Bloque_Else.ptr = crear_nodo (else, Bloque.ptr, null);

1
2

ACCIONES SEMNTICAS

Seleccin rbol Sintctico

if (a > 0) then
k := k*5;
else
j := j-3;

Ejemplo

IF

CUERP
O

COND

>
a

THE
N

ELS
E

:
=

:
=

*
k

Seleccin Comparacin Representaciones


REGLAS DE LA
GRAMTICA

POLACA INVERSA

TERCETOS

RBOL
SINTCTICO

<SELECCION> IF
<CONDICION_IF>
THEN
<BLOQUE_THEN>
ELSE
<BLOQUE_ELSE>

#_paso_incomp =
desapilar_paso();

completar_paso(#_paso_incom
p, #_paso_actual + 1);

#_terc_incomp =
desapilar_terceto();
completar_terceto(#_terc_incomp,
#_terc_actual + 1);

Cuerpo_IF.ptr =
crear_nodo(cuerpo,
Bloque_then.ptr,
Bloque_else.ptr);
IF.ptr = crear_nodo(IF,
Cond_IF.ptr, Cuerpo_IF.ptr);

<CONDICION_IF>
<CONDICION>

#_paso_actual =
create_paso( );
apilar_paso(#_paso_actual);
#_paso_actual =
create_paso(BF);

#_terc_actual =
crear_terceto(BF,Cond.prt, [?] );
apilar_terceto(#_terc_actual);

Cond_IF.ptr =
crear_nodo(cond,
Cond.ptr, null);

<BLOQUE_THEN>
<BLOQUE>

#_paso_incomp =
desapilar_paso();
completar(#_paso_incomp ,
#_paso_actual + 2);
#_paso_actual =
create_paso( );
apilar_paso(#_paso_actual);
#_paso_actual =
generar_paso(BI);

#_terc_incomp =
desapilar_terceto();
completar_terceto(#_terc_incomp,
#_terc_actual + 2);
#_terc_actual = crear_terceto(BI,
[?], -);
apilar_terceto(#_terc_actual);

Bloque_Then.ptr =
crear_nodo (then,
Bloque.ptr, null);

<BLOQUE_ELSE>
<BLOQUE>

Bloque_Else.ptr =
crear_nodo (else,

Generacin Cdigo Mquina


Algoritmos

Seguimiento de Registros

Requiere verificacin de registro disponible. (Tabla de Ocupacin de Registros)


Si se necesita un registro y no hay ms, se libera alguno moviendo el contenido a una variable
auxiliar.
Cdigo ms chico y rpido.
Se posterga el uso de registros de usos especficos.
Nmero mximo de registros necesarios depende de niveles de precedencia de operaciones.

Variables Auxiliares

Se opera sobre registros, pero todos los resultados se almacenan en variables auxiliares.
Todas las variables nuevas deben ser agregadas a la tabla de smbolos.
Cdigo ms largo.
Prefijos de variables auxiliares deben ser distintos a las variables de usuario.

Generacin Cdigo Mquina


Polaca Inversa

Utiliza una pila


Apila hasta operador
Operadores Binarios: desapila dos elementos y genera cdigo.
Operadores Unarios: desapila un elemento y genera cdigo.
Apila el resultado.

Tercetos

Por cada terceto genera el cdigo correspondiente.


Agrega el resultado a cada terceto.

rbol Sintctico

Busca sub-rbol de ms a la izquierda con hijos hoja.


Generar cdigo para el sub-rbol.
Reemplazar sub-rbol por el resultado.
NOTA: Resultado puede referirse al nombre de un registro o una
variable auxiliar.

Generacin Cdigo Mquina


Problemas

Qu sucede cuando se quieren marcar los lugares destino de


salto?
Los mecanismos de generacin de representacin intermedia vistos
para Polaca Inversa y Tercetos
NO aportan ninguna informacin al respecto.
Qu hacer?
ALTERNATIVA 1
Dos pasadas.
1. Se marcan los destinos de los
saltos.
2. Se genera el cdigo.

ALTERNATIVA 2
Durante la generacin de la
representacin intermedia.
Opcion A: Se marcan los destinos de los
saltos.
Opcin B: Se agregan pasos con
etiquetas.

Generacin Cdigo Mquina


Problemas

Cmo quedara la representacin intermedia?


1. ( < , a , 0 )
2. ( BF , [1], 6 )
3. ( * , k , 5 )
4. ( := , k , [3] )
5. ( BI , 8 , -- ) *
6. ( - , j , 3 )
7. ( := , j , [6] )
8. *

>

13

BF

:=

10

18

BI

j *

:=

11

12

13

14

15

16

17

18

Finalmente el Cdigo Mquina!

if (a > 0)
then
k := k*5;
else
j := j-3;

1.
2.
3.
4.
5.
6.
7.

(
(
(
(
(
(
(

>

13

BF

:=

10

18

BI

:=

11

12

13

14

15

16

17

< , a , 0 )
BF , [1], 6 )
* , k , 5 )
:= , k , [3] )
BI , 8 , -- )
- , j , 3 )
:= , j , [6] )

18

MOV R1, a
CMPL R1, 0
BF label_1
MOV R1, k
MUL R1, 5
BI label_2
label_1
MOV R1, j
SUB R1, 3
label_2

Вам также может понравиться