Está en la página 1de 19

Resto de Fases del

Compilador
Software de Sistemas
Mnica Pinto Alarcn
Curso 2005/2006

Fases del Compilador

Fase de Anlisis

Anlisis lxico
Anlisis sintctico
Anlisis semntico

Fase de Sntesis

Generacin de Cdigo Intermedio


Optimizacin de Cdigo Intermedio
Generacin de Cdigo Mquina
Optimizacin del Cdigo Mquina
2/38

Anlisis Semntico

Semntica

El conjunto de reglas que especifican el


significado de cualquier sentencia sintcticamente
correcta y escrita en un determinado lenguaje.

Se pueden encontrar sentencias que son


sintcticamente correctas, pero que no se
pueden ejecutar porque carecen de sentido.
En general, el anlisis semntico se hace a
la par que el anlisis sintctico introduciendo
en ste unas rutinas semnticas.
3/38

Anlisis Semntico

Ejemplo1:

Suponer que los identificadores de una sentencia son variables declaradas


de tipo real.
En la sentencia que se ha analizado existe una valor de tipo entero.
Sin embargo, las operaciones se realizan entre identificadores reales, por lo
que hay dos alternativas:

o emitir un mensaje de error Discordancia de tipos,


o realizar una conversin automtica de tipos, mediante una funcin auxiliar
inttoreal().

Ejemplo2:

Suponer una sentencia en la que se suman dos identificadores, donde uno


de ellos es el identificador de una variable de tipo entero y el otro el
identificador de una variable de tipo array.
El analizador semntico dar un error porque aunque la suma de dos
identificadores sintcticamente es correcto en el lenguaje de programacin,
no est definida la operacin de suma de un entero y un array.

4/38

Anlisis Semntico

El compilador realiza una comprobacin semntica esttica, frente a la


dinmica realizada en tiempo de ejecucin
Algunos ejemplos de Comprobaciones Semntica Estticas son :

Comprobacin de tipos: indicar error si un operador se aplica a un


operando incompatible. Ejemplo: sumar una variable de tipo vector con un
identificador funcin.
Comprobacin del control de flujo: Las sentencias que producen la
variacin de flujo deben verificar hacia donde se transfiere el control.

Ejemplo: la sentencia break de C hace que el control abandone el bucle while ms


interior, o una sentencia switch, aparecera un error si tal bucle no existe.

Comprobacin de unicidad: Existe situaciones en las que un elemento del


lenguaje slo se define una vez.

Ejemplo: en la zona de declaraciones, un identificador debe ser declarado una


sola vez, las etiquetas de la sentencia case deben ser distintas o los elementos de
un tipo enumerado no pueden repetirse.

5/38

Anlisis Semntico

Especificacin Formal de la Semntica


Una forma de proporcionar una especificacin precisa de los
aspectos semnticos de los lenguajes de programacin es
mediante las gramticas atribuidas.
Gramtica con Atributos

Una gramtica con atributos es una gramtica de contexto libre a


cuyos smbolos X (terminales y no terminales) se les asocia un
conjunto de atributos.
Adems a cada regla sintctica se le asocian unas reglas
semnticas que especifican como los atributos toman sus valores.
Mediante una gramtica atribuida podremos especificar qu debe
hacerse con los atributos para realizar el anlisis semntico y / o la
traduccin una vez que se ha realizado con xito el anlisis
sintctico.
6/38

Anlisis Semntico

G = (N,T,S,P)
Gramtica tipo 2 o de contexto libre:

A tira estando A en N y tira en (N U T)*


Se puede cambiar A por tira independientemente
del contexto en que aparezca A
Ejemplo:

N: S, A, B
T: a, b
P : SaB | bA
A a | aS | bAA
B b | bS | aBB
7/38

Definicin de las Reglas Semnticas

Reglas Semnticas:

Son una generalizacin o extensin de las reglas de la


gramtica.

Se basa en que el significado de una frase est directamente


relacionado con su estructura sintctica, segn se representa
en su rbol de anlisis sintctico.
Se realizan en paralelo

Anlisis Semntico
Traduccin

Esta notacin asocia a cada smbolo de la


gramtica (nodo u hoja) un conjunto de atributos.

8/38

Definicin de las Reglas Semnticas

Se utiliza la notacin smbolo.atributo


id.lexema
//id, token identificando una palabra reservada
var.valor
//var, token identificando una variable
var.direccin
//var, token identificando una variable
operacin.cdigo
//operacin, token identificando e.j. +,-,*,/
Se utilizan subndices para diferenciar smbolos
En lugar de describir la gramtica como L::,id L

L:: , id L1
L.Trad :: , || id.lexema || L1.Trad
Desde el punto de vista exclusivamente gramatical sera L::,id L

Los atributos pueden ser de dos tipos:


Sintetizados: se calculan a partir de los valores de los atributos de los
hijos.

La informacin asciende por el rbol

Heredados: se calculan a partir de los valores de los atributos de los


padres y / o hermanos.

Informacin descendente o de trnsito horizontal


Se usan para transferir atributos entre las reglas
9/38

Definicin de las Reglas Semnticas


El formato es:
Reglas/Producciones de la gramtica

A a1 a2 a3 ..... an

Reglas Semnticas

A.s = f (a1.s, a2.s, an.s)


ak.h = f (A.h, a1.h,..)
A (A.s = f(a1.s, , an.s))

a1
(a1.s)

an
(an.s)

a1 ak
(ak.h=f(a1.s, A.s,an.s)
(a1.s)

an
(an.s)

A veces se utilizan atributos llamados ficticios del no terminal de


la parte izquierda de la regla ( por ej: una funcin de imprimir).
10/38

Tipos de Traducciones

Dos Notaciones:

DDS: Definiciones Dirigidas por la Sintaxis

Formalismo de alto nivel para describir traducciones


Se ocultan los detalles de implementacin
No se impone orden de ejecucin de las reglas
Calcular los atributos en la produccin en la que aparecen

ETDS: Esquema de Traduccin Dirigido por la Sintaxis

Notacin de bajo nivel para describir un traductor


El traductor es de una sola pasada
Se hace explcito el orden de ejecucin de las acciones

11/38

Definiciones Dirigidas por Sintaxis

Gramticas con atributos

Las reglas semnticas slo manipulan atributos


No existen otras acciones semnticas
No existen efectos laterales

DDS

Es una generalizacin de las gramticas con atributos


Las reglas semnticas manipulan atributos
Existen otras acciones semnticas

Escritura de valores
Condicionales
Modificacin de Variables Globales

Existen efectos laterales


12/38

Ejemplo 1

Ejemplo de DDS

E:: E1 OP T if (OP.lexema == +){


//Clculo atributo sintetizado
E.valor := E1.valor + T.valor
}
else{
//Clculo atributo sintetizado
E.valor := E1.valor - T.valor
}
write(E.valor) //Efecto Lateral
13/38

Definiciones Dirigidas por Sintaxis

Se asume lo siguiente:

Los terminales slo tienen atributos sintetizados, los


proporcionados por el Analizador Lxico.
El axioma no tiene atributo heredado, sino se indica lo
contrario.

Ejemplo: Calculadora
L E \n
EE+T
EE-T
ET
T T*F
TT/F
TF
F(E)
Fd

El
ANALEX
entrega
los tokens:
d
opsr
opmd
pa ,pc
fin

L E fin
E E opsr T

L.v= imprime(E.v)
E.v=operacin(E.v,T.v,opsr.o)

ET
T T opmd F

E.v= T.v
T.v=operacin(T.v,F.v,opmd.o)

TF
F pa E pc
Fd

T.v= F.v
F.v= E.v
F.v= d.v
14/38

Ejemplo 2

Cadena de entrada:

El Analizador Lxico entregara los tokens:

4 + 5 * 6 + 3 \n
d opsr d opmd d opsr d fin

Secuencia de pasos:

Token : d, atributo d.v = 4, en el anlisis sintctico


ascendente se va reduciendo :

dFTE
El atributo no se puede perder, as pues se va trasladando su
valor mientras se va reduciendo: F.v = d.v // T.v = F.v // E.v
= T.v
El proceso sigue hasta que en la pila est E opsr T que se
reducir por E

15/38

Ejemplo 2

L.v = imprime(37)

E.v = 37

E.v = 34

T.v = 30

E.v = 4

T.v = 4

T.v = 5

F.v = 4

F.v = 5

T.v = 3

F.v = 6

d.v = 4

opsr.o = mas

d.v = 5

opmd.o = por

d.v = 6

opsr

opmd

F.v = 3

opsr.o=mas

opsr

d.v = 3

fin

fin

16/38

Ejemplo 3

Ejemplo DDS

h heredado, s sintetizado
t tipo, c representacin

S:: var L:T;

L:: L1,id

L:: id
T:: real
T:: integer

L.th := T.ts //Propagacin Horizontal


S.cs := L.cs //Propagacin Ascendente
L.cs:=L1.cs||L.th||id.lexema||;
L1.th:=L.th //Propagacin Descendente
L.cs:=L.th||id.lexema||;
T.ts:=float
T.ts:=int
17/38

Esquemas de Traduccin Dirigido por


Sintaxis

Notacin ETDS

Traductores de una sola pasada


Se insertan las acciones semnticas entre llaves y entre
los smbolos de la parte derecha de las reglas de la
gramtica
Indican explcitamente cundo se realiza la accin
semntica

Ejemplo:

Con atributos sintetizados:

Notacin DDS:

Notacin EDT:

TT*F
TT*F

T.v = T.v * F.val


{ T.v = T.v * F.val }

18/38

Esquemas de Traduccin Dirigido por


Sintaxis
Con atributos heredados:
EDT: E T { R.h = T.v } R { E.v = R.s }
Se suele escribir y leer en el orden indicado:
E T { R.h = T.v }
R { E.v = R.s }
Para especificar con EDT con atributos heredados se ha de tener en cuenta los siguiente:
Un atributo heredado de un smbolo se ha de calcular antes de la visita a dicho
smbolo: despus de visitar T y antes de visitar R se calcula su atributo heredado
R.h
Un atributo sintetizado de un smbolo se usar despus de la visita a dicho
smbolo. Rs se usa para calcular otro atributo despus de visitar R
Un atributo sintetizado de la parte izquierda de una regla (el padre) se calcular
al final, despus de calcular todos los atributos. E.v se calcula al final

19/38

Ejemplo 4
1

E:: T {E.th:=T.ts} E {E.ts := E.ts} 3


4
E::=op T {E1.th:=E.th||T.ts||op.lexema} E1 {E.ts:=E1.ts}
E::= {E.ts := E.th} 5
T ::= num {T.ts := num.lexema} 6

i,j Indica orden evaluacin,regla semntica


9-5+2
2,1

10,2

9,4
1,6

4,3

3,6

8,4

6,3

5,6

7,5

20/38

10

Esquemas de Traduccin Dirigido por


Sintaxis

Restricciones de Diseo

Si existen atributos sintetizados, colocar la accin


semntica despus de todos los smbolos
implicados o al final de la produccin

A:: B C {A.a := f(B.a,C.a)} D


A:: B C D {A.a := f(B.a,C.a)}

Si existen atributos heredados, deben calcularse


antes de que aparezca el smbolo en la parte
derecha

A:: B C {D.h:=f(B.a,C.a)} D
21/38

Ejemplo 5

Especificacin de un Comprobador de Tipos Elemental


Sea un lenguaje de programacin en el que es obligatorio
declarar todos los identificadores antes de ser usados.

En ese caso habra que realizar una comprobacin de unicidad.

Supongamos que en la tabla de smbolos antes de las


declaraciones el atributo tipo est inicializado a cero.
Cuando se lea una declaracin se debe aadir el valor
correspondiente al tipo declarado.
Si se encontrara una doble declaracin de la misma variable el
tipo ya no estara a cero, detectndose un error en la
comprobacin de unicidad.
As mismo cuando se use una variable se debe comprobar el
atributo tipo, si su valor fuera cero se detectara que no ha sido
declarada.

22/38

11

Ejemplo 5

El cdigo que habra que utilizar para estas


comprobaciones sera:

Cuando se declara la variable:

if (buscatipo(id.e) == 0)

else tratamientoerror();

aadetipo(id.e,id.tipo);

/* ya declarada */

Cuando se usa la variable:

if (buscatipo(id.e) == 0)

tratamientoerror(); /* variable no declarada */

else ............../*tratamiento correcto......*/


23/38

Ejemplo 5 (Continuacin)

ETDS para la parte de Declaraciones

PD;E
DD;D
D id : T

{ if (buscatipo(id.e)==0)
aadetipo(id.e,T.t);
else tratamientoerror();
}
T char
{T.t =CHAR;}
T integer
{T.t = INTEGER;}
T ^ T1
{T.t = pointer(T1.t);}
T array[num] of T1 { T.t = array(1..num.v,T1.t);}
24/38

12

Ejemplo 5 (Continuacin)

ETDS del comprobador de tipos de Expresiones

E literal
E num
E id

E E1 mod E2

E E1[E2]

E E1 ^

{ E.t= CHAR;}
{ E.t= INTEGER;}
{ if(buscatipo(id.e) !=0)
E.t=buscatipo(id.e);
else tratamientoerror();}
{ if (E1.t==INTEGER && E2.t==INTEGER)
E.t=INTEGER;
else E.t=tipo_error;}
{ if(E2.t==INTEGER && E1.t==array(x,y))
E.t=y;
else E.t=tipo_error;}
{ if(E1.t==pointer(y)) E.t=y;
else E.t=tipo_error;}

25/38

Ejemplo 5 (Continuacin)

ETDS del comprobador de tipos de Sentencias

A diferencia de las expresiones las sentencias no son, en


general, de ningn tipo. Se les pude asignar el tipo void si son
correctas.
Ahora usaremos P D ; S en vez de P D ; E

S id := E

{ if(buscatipo(id.e)!=0) id.t=buscatipo(id.e);
else if (id.t==E.t) S.t=void;
else S.t=tipo_error;}
S if E then S1
{ if(E.t==BOOLEAN) S.t = S1.t;
else S.t = tipo_error;}
S while E do S1 { if(E.t==BOOLEAN) S.t = S1.t;
else S.t = tipo_error;}
S S1 ; S2
{ if (S1.t ==void &&S2.t==void) S.t=void;
else S.t = tipo_error;}

26/38

13

Generacin de Cdigo Intermedio

Con la generacin de Cdigo intermedio se inicia la


tarea de sntesis.
No suele ser un lenguaje de programacin de
ninguna mquina real, sino el correspondiente a
una mquina abstracta

se debe definir lo ms general posible para que sea


posible traducirlo a cualquier mquina real.

El objetivo del Cdigo Intermedio es reducir el


nmero de programas necesarios para construir
traductores

permite mayor portabilidad de unas mquinas a otras.

27/38

Generacin de Cdigo Intermedio

Distinto formato de las instrucciones:

Cdigo de tres direcciones

Se puede implantar mediante:

Cuartetos
Tercetos
Tercetos indirectos

Notacin polaca inversa


rboles sintcticos
Lenguaje de medio nivel como el C

28/38

14

Generacin de Cdigo Intermedio

Cdigo de Tres direcciones Cuartetos

Se implanta en una secuencia de registros con 4 campos:

Operacin
Argumento1
Argumento2
Resultado

Al generar temporales han de ser insertados en la TDS.


Ejemplo para: a:=b* -c+b* -c
El resultado, en cdigo de tres direcciones y la implantacin en
cuartetos es:
Cdigo en 3 dir
t1 := -c
t2 :=b*t1
t3 :=-c
t4 :=b*t3
t5 :=t2+t4
a:=t5

Operador
-unario
*
-unario
*
+
:=

Argumento1 Argumento2 Resultado


c
t1
b
t1
t2
c
b
t3
t4
t2
t4
t5
t5
a
29/38

Ejemplo 6

Cdigo de tres direcciones Cuartetos:

La expresin (a + b ) * ( c + d ) puede traducirse al


siguiente conjunto de cuartetos:

(+, a, b, t1)
(+, c, d, t2)
(*,t1, t2, t3)

Se indica la operacin que ha de realizarse con los dos


operandos que van a continuacin y el resultado se guarda
en la variable que est en ltimo lugar.
Los nombres t1, t2 y t3 pueden ser registros de la mquina
o posiciones de memoria temporales, que desaparecen
cuando se termine la compilacin.
30/38

15

Generacin de Cdigo Intermedio

Cdigo de Tres direcciones Tercetos

Para evitar introducir temporales en la Tabla de Smbolos, se


hace referencia a un valor temporal mediante la posicin de la
proposicin que lo calcula.
En este caso los registros son de 3 campos. Para el ejemplo
anterior:

Cdigo en 3 dir
t1 := -c
t2 :=b*t1
t3 :=-c
t4 :=b*t3
t5 :=t2+t4
a:=t5

Posicin
(0)
(1)
(2)
(3)
(4)
(5)

Operador
-unario
*
-unario
*
+
:=

Argumento1 Argumento2
c
b
(0)
c
b
(2)
(1)
(3)
a
(4)

31/38

Generacin de Cdigo Intermedio

Cdigo de Tres direcciones Tercetos Indirectos

Se hace una lista de los punteros a tercetos

Tercetos

Tercetos
Indirectos

Proposicin
(0)
(1)
(2)
(3)
(4)
(5)

Proposicin
(0)
(1)
(0)
(1)
(4)
(5)

Posicin
(0)
(1)
(2)
(3)
(4)
(5)

Posicin
(0)
(1)
(4)
(5)

Operador
-unario
*
-unario
*
+
:=

Argumento1 Argumento2
c
b
(0)
c
b
(2)
(1)
(3)
a
(4)

Operador
-unario
*
+
:=

Argumento1 Argumento2
c
b
(0)
(1)
(3)
a
(4)

32/38

16

Notacin Polaca Inversa

En el que los operadores se colocan en el orden en que van a


ser ejecutados y adems no es necesario el uso de parntesis.
Una representacin de la expresin anterior sera:

ab+cd+*

// Notacin post-fija

Habitualmente va ligada a mquinas que utilizan una pila y su


representacin interna sera:

PUSH a
(Almacena a en la pila)
PUSH b
(Almacena b en la pila)
ADD
(Extrae dos valores de la pila, los suma y guarda el
resultado en la pila)
PUSH c
(Almacena c en la pila)
PUSH d
(Almacena d en la pila)
ADD
(Extrae dos valores de la pila, los suma y guarda el
resultado en la pila)
MUL
(Extrae dos valores de la pila, los multiplica y guarda el
resultado en la pila)

33/38

Optimizacin de Cdigo Intermedio

A partir del cdigo intermedio anterior se crea


un nuevo cdigo ms compacto y eficiente,

eliminando por ejemplo sentencias que no se


ejecutan nunca,
simplificando expresiones aritmticas, etc...

La profundidad con que se realiza esta


optimizacin vara mucho de unos
compiladores a otros.

En el peor de los casos esta fase se suprime.


34/38

17

Ejemplo 7

Ejemplo de Cdigo intermedio de tres direcciones

temp1 := inttoreal(2)
temp2 := IDENT3 * temp1
temp3 := IDENT2 + temp2
IDENT1 := temp3

Cdigo optimizado

Es posible evitar la funcin inttoreal mediante el cambio de


2 por 2.0, obviando adems una de las operaciones
anteriores.
El cdigo optimizado quedara como sigue:

temp1 := IDENT3 * 2.0


IDENT1:= IDENT2 + temp1
35/38

Generacin de Cdigo Mquina

A partir de los anlisis anteriores y de las tablas que


estos anlisis van creando durante su ejecucin,
esta fase produce un cdigo o lenguaje objeto que
es directamente ejecutable por la mquina.
Es la fase final del compilador.
Las instrucciones del cdigo intermedio se traducen
una a una en cdigo mquina reubicable.
Cada instruccin del cdigo intermedio puede dar
lugar a ms de una de cdigo mquina.

36/38

18

Ejemplo 8

El cdigo anterior traducido a ensamblador quedara


MOVEt R1, id3 // R1 id3
MUL R1, 2.0 // R1 = R1 * 2.0
MOVEt R2, id2 // R2 id2
SUM R2, R1
// R2 = R2 + R1
MOVEf id1, R2 // id1 R2

Observar que este cdigo ensamblador no se corresponde con el


cdigo de la mquina GOAT vista anteriormente.

Donde id1, id2 y id3 representan las posiciones de memoria en


la que se hallan almacenadas estas variables; R1 y R2 son los
registros de la mquina; y las instrucciones MOVEt, MOVEf,
MUL, SUM representan las operaciones de colocar un valor de
memoria en un registro, colocar un valor de un registro en
memoria, multiplicar en punto flotante y sumar.
37/38

Optimizacin de Cdigo Mquina

A partir del cdigo mquina anterior se crea


un nuevo cdigo mquina ms compacto y
eficiente
La profundidad con que se realiza esta
optimizacin vara mucho de unos
compiladores a otros.

En el peor de los casos esta fase se suprime.

38/38

19

También podría gustarte