Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PROGRAMA FUENTE
COMPILADOR
SALIDA
Mensajes de Error
Un compilador es un programa que traduce un programa escrito en lenguaje fuente y produce otro equivalente escrito en un lenguaje objetivo.
Lenguaje Fuente
Lenguaje de alto nivel. Por ejemplo: C, Pascal, C++. Lenguaje especializado para alguna disciplina especfica dentro de las Ciencias de la Computacin.
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
Fases de la Compilacin
Programa Fuente
Tabla de Smbolos
Errores
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
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
Fases de la Compilacin
Programa Fuente
Tabla de Smbolos
Errores
Fases de la Compilacin
Programa Fuente
Tabla de Smbolos
Errores
Fases de la Compilacin
Errores
Programa Fuente
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
Fases de la Compilacin
Errores
Programa Fuente
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
Fases de la Compilacin
Suele haber preprocesadores para:
Eliminar comentarios Incluir archivos Expandir macros Efectuar compilacin condicional Reemplazar constantes simblicas
Fases de la Compilacin
Errores
Programa Fuente
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
Anlisis Lxico
Lee el programa fuente. Remueve espacios en blanco, tabulaciones, saltos de lnea. Remueve comentarios. Agrupa los caracteres en unidades llamadas tokens.
Anlisis Lxico
Un token es una secuencia de caracteres que forman una unidad significativa
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.
Anlisis Lxico
Ejemplo
if Plazo >= 30 then Tasa := Base + Recargo / 100 else Tasa := Base
Anlisis Lxico
Ejemplo
[if] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]
Anlisis Lxico
Tokens
Palabras reservadas.
Operadores
Anlisis Lxico
Tokens
Los tokens se diferencian de la cadena de caracteres que representan. La cadena de caracteres es el Lexema o valor lxico.
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.
Anlisis Lxico
Token ID CTE IF THEN ELSE + / >= :=
Diseo de Compiladores I - 2007
Anlisis Lxico
Ejemplo
[if] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]
Anlisis Lxico
Ejemplo
[59] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]
Anlisis Lxico
Ejemplo
[59] [27] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]
Anlisis Lxico
Ejemplo
[59] [27] [80] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]
Anlisis Lxico
Ejemplo
[59] [27] [80] [28] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base]
Anlisis Lxico
Ejemplo
[59] [27] [80] [28] [60] [27] [85] [27] [70] [27] [73] [28] [61] [27] [85] [27]
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]
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
Fases de la Compilacin
Errores
Tira de tokens Programa Fuente
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
Fases de la Compilacin
Errores
Tira de tokens Programa Fuente
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
Anlisis Sintctico
Agrupa los tokens del programa fuente en frases gramaticales que el compilador usar en las siguientes etapas.
Anlisis Sintctico
Los tokens son smbolos terminales en la gramtica que describe al lenguaje fuente
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
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
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
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
Fases de la Compilacin
Errores
Tira de tokens Programa Fuente Lista de reglas
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
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
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
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
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:
Cdigo Intermedio
Ejemplo
Tasa := Base + Recargo / 100 p ID := ID + ID / CTE
:= ID ID ID + / ItoF CTE
(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
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
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.
FLD, Recargo FLD, Cte1 FDIV FLD, Base FADD FSTP, Tasa
Cdigo Assembler
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
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).
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
Fases de la Compilacin
Errores
Lista de reglas
Anlisis Lxico
Anlisis Sintctico
Generacin de Cdigo
Salida
Tabla de Smbolos
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.