Sei sulla pagina 1di 56

Diseo de Compiladores I

Estructura General de un Compilador

Estructura General de un Compilador

PROGRAMA FUENTE

COMPILADOR

SALIDA

Mensajes de Error

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Un compilador es un programa que traduce un programa escrito en lenguaje fuente y produce otro equivalente escrito en un lenguaje objetivo.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Lenguaje Fuente


Lenguaje de alto nivel. Por ejemplo: C, Pascal, C++. Lenguaje especializado para alguna disciplina especfica dentro de las Ciencias de la Computacin.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Salida


 

Cdigo de Mquina. Escrito en las instrucciones de mquina de la computadora en la que se ejecutar. Cdigo Binario. Deber ser vinculado con las libreras correspondientes para obtener el cdigo ejecutable. Cdigo Assembler. Deber ser ensamblado y vinculado. Otro lenguaje de alto nivel.
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Fases de la Compilacin
Programa Fuente

Anlisis Lxico Anlisis Sintctico

Tabla de Smbolos

Anlisis Semntico Generacin de Cdigo Intermedio Optimizacin Generacin de Cdigo Objetivo


Salida

Errores

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Front End
Fases que dependen del lenguaje fuente
      

Anlisis Lxico Anlisis Sintctico Anlisis Semntico (Esttico) Creacin de la Tabla de Smbolos Generacin de Cdigo Intermedio Algo de Optimizacin Manejo de errores correspondiente a las fases del Front End
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Back End
Fases que dependen de la mquina objetivo
  

Generacin de la salida Optimizacin Manejo de errores correspondiente a las fases del Back End Operaciones sobre la Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Programa Fuente

Anlisis Lxico Anlisis Sintctico

Tabla de Smbolos

Anlisis Semntico Generacin de Cdigo Intermedio Optimizacin Generacin de Cdigo Objetivo


Salida

Errores

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Programa Fuente

Anlisis Lxico Anlisis Sintctico

Tabla de Smbolos

Anlisis Semntico Generacin de Cdigo Intermedio Optimizacin Generacin de Cdigo Objetivo


Salida

Errores

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Errores

Programa Fuente

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Errores

Programa Fuente

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Suele haber preprocesadores para:
    

Eliminar comentarios Incluir archivos Expandir macros Efectuar compilacin condicional Reemplazar constantes simblicas

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Errores

Programa Fuente

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
 

 

Lee el programa fuente. Remueve espacios en blanco, tabulaciones, saltos de lnea. Remueve comentarios. Agrupa los caracteres en unidades llamadas tokens.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Un token es una secuencia de caracteres que forman una unidad significativa

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
La interaccin entre el Anlisis Lxico y el Anlisis Sintctico puede ocurrir de distintas formas:
  

Ambas actividades se ejecutan en modo batch. Ambas actividades son concurrentes. Ambas actividades son rutinas del Generador de Cdigo. El Anlisis Lxico es una rutina del Anlisis Sintctico.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

if Plazo >= 30 then Tasa := Base + Recargo / 100 else Tasa := Base

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[if] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Tokens


Palabras reservadas.


Ejemplos: IF, THEN, ELSE Ejemplos: +, "=, := Ejemplos: Identificador, Constante

Operadores


Cadenas de mltiples caracteres




Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Tokens
 

Los tokens se diferencian de la cadena de caracteres que representan. La cadena de caracteres es el Lexema o valor lxico.


Existen tokens que se corresponden con un nico lexema




Ejemplo: Palabra Reservada IF

Existen tokens que pueden representar lexemas diferentes




Ejemplo: Identificador Plazo, Identificador Tasa


Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Anlisis Lxico


El Anlisis Lxico hace una correspondencia entre cada token y un nmero entero. El Anlisis Lxico entrega al Anlisis Sintctico los tokens. Cuando un token puede corresponder a ms de un lexema, el Anlisis Lxico entrega al Anlisis Sintctico el par token-lexema.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Token ID CTE IF THEN ELSE + / >= :=
Diseo de Compiladores I - 2007

Identificacin del token 27 28 59 60 61 70 73 80 85


Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[if] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[59] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[59] [27] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[59] [27] [80] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[59] [27] [80] [28] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[59] [27] [80] [28] [60] [27] [85] [27] [70] [27] [73] [28] [61] [27] [85] [27]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo

[59] [27, Plazo] [80] [28, 30] [60] [27, Tasa] [85] [27, Base] [70] [27,Recargo] [73] [28, 100] [61] [27,Tasa] [85] [27,Base]

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Lxico
Ejemplo
[59] [27] [80] [28] [60] [27] [85] [27] [70] [27] [73] [28] [61] [27] [85] [27] IF ID >= CTE THEN ID := ID + ID / CTE ELSE ID := ID

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Errores
Tira de tokens Programa Fuente

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Errores
Tira de tokens Programa Fuente

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Sintctico
Agrupa los tokens del programa fuente en frases gramaticales que el compilador usar en las siguientes etapas.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Sintctico
Los tokens son smbolos terminales en la gramtica que describe al lenguaje fuente

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Sintctico


La estructura jerrquica de un programa es representada por reglas que constituyen una gramtica. Las reglas se representan por medio de producciones. Cada produccin define un smbolo no terminal en funcin de smbolos terminales o tokens, y otros smbolos no terminales. Existe una produccin que define al no terminal programa.
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Anlisis Sintctico
Gramtica
5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

sent" p sel" sent" p asig" sel" p IF cond" THEN sent" ELSE sent" cond" p exp" comp" exp" comp" p < | > | <= | >= | == | <> asig" p ID := exp" exp" p exp" + term" exp" p exp" - term" exp" p term" term" p term"  fact" term" p term" / fact" term" p fact" fact" p ID fact" p CTE
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Anlisis Sintctico


Usualmente, la estructura gramatical que el Anlisis Sintctico detecta en el cdigo fuente es representada por un rbol de parsing. El rbol de parsing demuestra como la secuencia de tokens de entrada puede ser derivada a partir de las reglas de una gramtica.
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Anlisis Sintctico
rbol de Parsing
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
asig expr
(10) (11)

expr
(13) (15)

term

term
(16)

term
(16)

fact
(17)

fact
(17)

fact
(18)

ID

:=

ID

ID

CTE

Lista de reglas: 17 16 13 17 16 18 15 11 10
Diseo de Compiladores I - 2007 Estructrura General de un Compilador

Fases de la Compilacin
Errores
Tira de tokens Programa Fuente Lista de reglas

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Fases de la Compilacin
Errores
Tira de tokens Programa Fuente Lista de reglas

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Generacin de Cdigo
Tercetos B C Lista de Reglas D rbol Sintctico I G H E A Polaca Inversa Cuartetos J Cdigo Assembler K F

Caminos posibles:

Camino 1: A Camino 2: D, I

Camino 3: E, L Camino 4: C, J

Camino 5: B, K Camino 6: D, F, K

Camino 7: D, G, J Camino 8: D, H, L

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Generacin de Cdigo
rbol Sintctico
Es una representacin comprimida del rbol de parsing.
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
:=

ID

ID

ID

CTE

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Anlisis Semntico
 

Analiza el significado del programa. Chequea reglas que no pueden ser capturadas por la gramtica, pero que pueden ser verificadas en tiempo de compilacin. Estas reglas corresponden a la semntica esttica del lenguaje. Ejemplos:
 

Chequeo de tipos en expresiones aritmticas. Chequeo de tipo y nmero de parmetros en la llamada a una rutina.
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Anlisis Semntico
Ejemplo
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
:=

ID

ID

ID

ItoF

CTE
Diseo de Compiladores I - 2007 Estructrura General de un Compilador

Cdigo Intermedio


Representacin del cdigo fuente como un programa escrito para ser ejecutado en una mquina abstracta. Posibles representaciones intermedias:
  

Tercetos Cuartetos Polaca Inversa

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Cdigo Intermedio
Ejemplo
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
:= ID ID ID + / ItoF CTE

14. 15. 16. 17. 18. 19.

(ItoF, 100, -) (/, Recargo, [15]) (+, Base, [16]) (:=, Tasa, [17])
Tercetos
Estructrura General de un Compilador

rbol Sintctico
Diseo de Compiladores I - 2007

Optimizacin


Transforma la representacin actual del cdigo en una nueva versin que logra el mismo resultado ms eficientemente. Pueden aplicarse optimizaciones en diferentes etapas de la compilacin:
    

durante la creacin de la representacin intermedia, durante la transformacin de una representacin intermedia en otra, durante la traduccin del cdigo intermedio a la salida, luego de generar la salida, e incluso durante la linkedicin o la ejecucin.
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Optimizacin
Ejemplo
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
14. 15. 16. 17. 18. 19.

(ItoF, 100, -) (/, Recargo, [15]) (+, Base, [16]) (:=, Tasa, [17])
Tercetos

14. 15. 16. 17. 18.

(/, Recargo, 100.0) (+, Base, [15]) (:=, Tasa, [16])


Tercetos Optimizados
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Generacin de Cdigo propiamente dicho




Se traduce la representacin intermedia del programa fuente en el cdigo nativo de la mquina objetivo. El cdigo generado efectuar el chequeo de las reglas de semntica dinmica del lenguaje, que no pudieron ser verificadas durante la compilacin.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Generacin de Cdigo Assembler


Ejemplo
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
14. 15. 16. 17. 18.

(/, Recargo, 100.0) (+, Base, [15]) (:=, Tasa, [16])


Tercetos Optimizados

FLD, Recargo FLD, Cte1 FDIV FLD, Base FADD FSTP, Tasa
Cdigo Assembler
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Fases de la Compilacin
Errores
Tira de tokens Programa Fuente Lista de reglas

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Tabla de Smbolos
Es una estructura de datos que contiene un registro para cada identificador utilizado en el cdigo fuente, con campos que contienen informacin relevante para cada smbolo (atributos).

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Tabla de Smbolos


Cuando el Anlisis Lxico detecta un token de tipo identificador, lo ingresa en la Tabla de Smbolos. Durante la Generacin de Cdigo se ingresa informacin para los atributos de los smbolos, y se usa esa informacin de diversas maneras. Durante la Generacin de Cdigo puede ser necesario incorporar nuevas entradas a la Tabla de Smbolos.
Estructrura General de un Compilador

Diseo de Compiladores I - 2007

Fases de la Compilacin
Errores

Tira de tokens Programa Fuente

Lista de reglas

Anlisis Lxico

Anlisis Sintctico

Generacin de Cdigo

Salida

Tabla de Smbolos

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Manejo de Errores


Cada una de las etapas del Compilador puede detectar errores que son informados al programador. Un buen compilador no debera terminar su ejecucin al detectar un error, sino que debera recuperarse y continuar con la compilacin.

Diseo de Compiladores I - 2007

Estructrura General de un Compilador

Potrebbero piacerti anche