Académique Documents
Professionnel Documents
Culture Documents
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
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
Tercetos
Lista de
Reglas
rbol
Sintctic
o
Cuartet
os
Cdigo
Assembl
er
Polaca
Inversa
Mquina
de Pila
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
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
Cdigo
Assembl
er
rbol
Sintctic
o
Lista de
Reglas
Polaca
Inversa
x := y + z
:
=
x
+
y
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
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
FIN DEL BLOQUE THEN. (Se conoce la direccin destino del BF y necesita un
BI)
2
1.
2.
3.
4.
FIN DEL BLOQUE ELSE. (Se conoce la direccin destino del BI)
1. Desapilar la direccin del paso incompleto.
2. Completar con #_paso_actual + 1.
ACCIONES SEMNTICAS
#_paso_incomp = desapilar_paso();
//Desapila direccin
incompleta.
1 <CONDICION_IF> <CONDICION>
<BLOQUE_THEN> <BLOQUE>
#_paso_actual = create_paso(BF);
#_paso_incomp = desapilar_paso();
//Desapila direccin
incompleta.
//Completa
el destino de BF.
#_paso_actual = generar_paso(BI);
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
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
1 <CONDICION_IF> <CONDICION>
ACCIONES SEMNTICAS
#_terc_incomp = desapilar_terceto();
completar_terceto(#_terc_incomp, #_terc_actual + 1);
//Completa el terceto BI.
apilar_terceto(#_terc_actual);
incompleto.
<BLOQUE_THEN> <BLOQUE>
#_terc_incomp = desapilar_terceto();
completar_terceto(#_terc_incomp, #_terc_actual + 2);
//Completa el terceto BF.
//Crea un terceto
incompleto.
apilar_terceto(#_terc_actual);
incompleto.
<BLOQUE_ELSE> <BLOQUE>
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;
1
2
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
REGLAS DE LA GRAMTICA
3 <SELECCION> IF <CONDICION_IF> THEN
<BLOQUE_THEN> ELSE <BLOQUE_ELSE>
<CONDICION_IF> <CONDICION>
<BLOQUE_THEN> <BLOQUE>
<BLOQUE_ELSE> <BLOQUE>
1
2
ACCIONES SEMNTICAS
if (a > 0) then
k := k*5;
else
j := j-3;
Ejemplo
IF
CUERP
O
COND
>
a
THE
N
ELS
E
:
=
:
=
*
k
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,
Seguimiento de Registros
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.
Tercetos
rbol Sintctico
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.
>
13
BF
:=
10
18
BI
j *
:=
11
12
13
14
15
16
17
18
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