Está en la página 1de 56

Diseño de

Compiladores I
Estructura General de un
Compilador
Estructura General de un Compilador

PROGRAMA SALIDA
FUENTE COMPILADOR

Mensajes
de
Error

Diseño de Compiladores I - 2008 Estructura General de un Compilador


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

Diseño de Compiladores I - 2008 Estructura General de un Compilador


3
Lenguaje Fuente
l Lenguaje de alto nivel. Por ejemplo: C,
Pascal, C++.
l Lenguaje especializado para alguna
disciplina específica dentro de las Ciencias
de la Computación.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


4
Salida
l Código Assembler. Deberá ser ensamblado y
vinculado.
l Código Binario. Deberá ser vinculado con las
librerías correspondientes para obtener el
código ejecutable.
l Código de Máquina. Escrito en las
instrucciones de máquina de la computadora
en la que se ejecutará.
l Otro lenguaje de alto nivel.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


5
Fases de la Compilación
Programa Fuente

Análisis
Léxico

Análisis
Sintáctico

Análisis
Tabla Semántico
de Errores
Símbolos Generación de
Código Intermedio

Optimización

Generación de
Código Destino

Salida
Diseño de Compiladores I - 2008 Estructura General de un Compilador
6
Front End (Análisis)
Fases que dependen del lenguaje fuente
l Análisis Léxico
l Análisis Sintáctico
l Análisis Semántico (Estático)
l Creación de la Tabla de Símbolos
l Generación de Código Intermedio
l Algo de Optimización
l Manejo de errores correspondiente a las fases del
Front End
Diseño de Compiladores I - 2008 Estructura General de un Compilador
7
Back End (Síntesis)
Fases que dependen de la máquina destino
l Generación de la salida
l Optimización
l Manejo de errores correspondiente a las fases del
Back End
l Operaciones sobre la Tabla de Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


8
Fases de la Compilación
Programa Fuente

Análisis
Léxico

Análisis
Sintáctico

Análisis
Tabla Semántico
de Errores
Símbolos Generación de
Código Intermedio

Optimización

Generación de
Código Destino

Salida
Diseño de Compiladores I - 2008 Estructura General de un Compilador
9
Fases de la Compilación
Programa Fuente

Análisis
Léxico

Análisis
Sintáctico

Análisis
Tabla Semántico
de Errores
Símbolos Generación de
Código Intermedio

Optimización

Generación de
Código Destino

Salida
Diseño de Compiladores I - 2008 Estructura General de un Compilador
10
Fases de la Compilación
Errores

Programa Análisis Análisis Generación Salida


Fuente Sintáctico
Léxico de Código

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


11
Fases de la Compilación
Errores

Programa
Fuente * Análisis
Léxico
Análisis
Sintáctico
Generación
de Código
Salida

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


12
Fases de la Compilación
Suele haber preprocesadores para:
l Eliminar comentarios
l Incluir archivos
l Expandir macros
l Efectuar compilación condicional
l Reemplazar constantes simbólicas

Diseño de Compiladores I - 2008 Estructura General de un Compilador


13
Fases de la Compilación
Errores

Programa
Fuente
Análisis
Léxico * Análisis
Sintáctico
Generación
de Código
Salida

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


14
Análisis Léxico
l Lee el programa fuente.
l Remueve espacios en blanco, tabulaciones,
saltos de línea.
l Remueve comentarios.
l Agrupa los caracteres en unidades llamadas
tokens.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


15
Análisis Léxico

Un token es una secuencia de caracteres


que forman una unidad significativa

Diseño de Compiladores I - 2008 Estructura General de un Compilador


16
Análisis Léxico
La interacción entre el Análisis Léxico y el Análisis
Sintáctico puede ocurrir de distintas formas:
l Ambas actividades se ejecutan en modo batch.
l Ambas actividades son concurrentes.
l Ambas actividades son rutinas del Generador de
Código.
l El Análisis Léxico es una rutina del Análisis Sintáctico.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


17
Análisis Léxico
Ejemplo

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

Diseño de Compiladores I - 2008 Estructura General de un Compilador


18
Análisis Léxico
Ejemplo

[if] [Plazo] [>=] [30]


[then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100]
[else] [Tasa] [:=] [Base]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


19
Análisis Léxico
Tokens

l Palabras reservadas.
l Ejemplos: IF, THEN, ELSE
l Operadores
l Ejemplos: ‘+’, ‘>=‘, ‘:=‘
l Cadenas de múltiples caracteres
l Ejemplos: Identificador, Constante

Diseño de Compiladores I - 2008 Estructura General de un Compilador


20
Análisis Léxico
Tokens

l Los tokens se diferencian de la cadena de


caracteres que representan.
l La cadena de caracteres es el Lexema o
valor léxico.
l Existen tokens que se corresponden con un único
lexema
l Ejemplo: Palabra Reservada IF
l Existen tokens que pueden representar lexemas
diferentes
l Ejemplo: Identificador Plazo, Identificador Tasa

Diseño de Compiladores I - 2008 Estructura General de un Compilador


21
Análisis Léxico
l El Análisis Léxico hace una correspondencia
entre cada token y un número entero.
l El Análisis Léxico entrega al Análisis
Sintáctico los tokens.
l Cuando un token puede corresponder a más
de un lexema, el Análisis Léxico entrega al
Análisis Sintáctico el par token-atributo.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


22
Análisis Léxico
Token Identificación
del token
ID 27
CTE 28
IF 59
THEN 60
ELSE 61
+ 70
/ 73
>= 80
:= 85

Diseño de Compiladores I - 2008 Estructura General de un Compilador


23
Análisis Léxico
Ejemplo

[if] [Plazo] [>=] [30]


[then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100]
[else] [Tasa] [:=] [Base]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


24
Análisis Léxico
Ejemplo

[59] [Plazo] [>=] [30]


[then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100]
[else] [Tasa] [:=] [Base]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


25
Análisis Léxico
Ejemplo

[59] [27] [>=] [30]


[then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100]
[else] [Tasa] [:=] [Base]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


26
Análisis Léxico
Ejemplo

[59] [27] [80] [30]


[then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100]
[else] [Tasa] [:=] [Base]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


27
Análisis Léxico
Ejemplo

[59] [27] [80] [28]


[then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100]
[else] [Tasa] [:=] [Base]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


28
Análisis Léxico
Ejemplo

[59] [27] [80] [28]


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

Diseño de Compiladores I - 2008 Estructura General de un Compilador


29
Análisis Léxico
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’]

Diseño de Compiladores I - 2008 Estructura General de un Compilador


30
Análisis Léxico
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

Diseño de Compiladores I - 2008 Estructura General de un Compilador


31
Fases de la Compilación
Errores

Tira de
tokens
Programa Análisis Análisis Generación Salida
Fuente Sintáctico
Léxico de Código

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


32
Fases de la Compilación
Errores

Tira de
tokens
Programa
Fuente
Análisis
Léxico
Análisis
Sintáctico * Generación
de Código
Salida

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


33
Análisis Sintáctico
Agrupa los tokens del programa
fuente en frases gramaticales
que el compilador usará en las
siguientes etapas.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


34
Análisis Sintáctico

Los tokens son símbolos terminales en la


gramática que describe al lenguaje fuente

Diseño de Compiladores I - 2008 Estructura General de un Compilador


35
Análisis Sintáctico
l La estructura jerárquica de un programa es
representada por reglas que constituyen una
gramática.
l Las reglas se representan por medio de
producciones.
l Cada producción define un símbolo no terminal en
función de símbolos terminales o tokens, y otros
símbolos no terminales.
l Existe una producción que define al no terminal
programa.
Diseño de Compiladores I - 2008 Estructura General de un Compilador
36
Análisis Sintáctico
Gramática

5. <sent> → <sel>
6. <sent> → <asig>
7. <sel> → IF <cond> THEN <sent> ELSE <sent>
8. <cond> → <exp> <comp> <exp>
9. <comp> → < | > | <= | >= | == | <>
10. <asig> → ID := <exp>
11. <exp> → <exp> + <term>
12. <exp> → <exp> - <term>
13. <exp> → <term>
14. <term> → <term> ∗ <fact>
15. <term> → <term> / <fact>
16. <term> → <fact>
17. <fact> → ID
18. <fact> → CTE

Diseño de Compiladores I - 2008 Estructura General de un Compilador


37
Análisis Sintáctico
l Usualmente, la estructura gramatical que el
Análisis Sintáctico detecta en el código
fuente es representada por un árbol de
parsing.
l El árbol de parsing demuestra como la
secuencia de tokens de entrada puede ser
derivada a partir de las reglas de una
gramática.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


38
Análisis Sintáctico
Árbol de Parsing
Tasa := Base + Recargo / 100 → ID := ID + ID / CTE

asig

expr
(10) (11)

expr term
(15)
(13)

term term
(16) (16)

fact fact fact


(17) (17) (18)

ID := ID + ID / CTE

Lista de reglas: 17 16 13 17 16 18 15 11 10
Diseño de Compiladores I - 2008 Estructura General de un Compilador
39
Fases de la Compilación
Errores

Tira de Lista de
tokens reglas
Programa Análisis Análisis Generación Salida
Fuente Sintáctico
Léxico de Código

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


40
Fases de la Compilación
Errores

Tira de Lista de
tokens reglas
Programa Análisis Análisis Generación Salida
Fuente Sintáctico
Léxico de Código

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


41
Generación de Código
Tercetos K

B
F
C

Lista de Árbol Código


D G Cuartetos J
Reglas Sintáctico Assembler
H
I
E

A
Polaca L
Inversa

Caminos posibles: Camino 1: A Camino 3: E, L Camino 5: B, K Camino 7: D, G, J


Camino 2: D, I Camino 4: C, J Camino 6: D, F, K Camino 8: D, H, L

Diseño de Compiladores I - 2008 Estructura General de un Compilador


42
Generación de Código
Árbol Sintáctico
Es una representación comprimida del Árbol de Parsing.

Tasa := Base + Recargo / 100 → ID := ID + ID / CTE


:=

ID +

ID /

ID CTE

Diseño de Compiladores I - 2008 Estructura General de un Compilador


43
Análisis Semántico
l Analiza el significado del programa.
l Chequea reglas que no pueden ser
capturadas por la gramática, pero que
pueden ser verificadas en tiempo de
compilación. Estas reglas corresponden a la
semántica estática del lenguaje.
l Ejemplos:
l Chequeo de tipos en expresiones aritméticas.
l Chequeo de tipo y número de parámetros en la
llamada a una rutina.
Diseño de Compiladores I - 2008 Estructura General de un Compilador
44
Análisis Semántico
Ejemplo
Tasa := Base + Recargo / 100 → ID := ID + ID / CTE
:=

ID +

ID /

ID ItoF

CTE

Diseño de Compiladores I - 2008 Estructura General de un Compilador


45
Código Intermedio
l Representación del código fuente como un
programa escrito para ser ejecutado en una
máquina abstracta.
l Posibles representaciones intermedias:
l Tercetos
l Cuartetos
l Polaca Inversa

Diseño de Compiladores I - 2008 Estructura General de un Compilador


46
Código Intermedio
Ejemplo
Tasa := Base + Recargo / 100 → ID := ID + ID / CTE

:= 14. …
ID +
15. (ItoF, 100, -)
16. (/, Recargo, [15])
ID /
17. (+, Base, [16])
ID ItoF
18. (:=, Tasa, [17])
CTE 19. …
Árbol Sintáctico Tercetos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


47
Optimización
l Transforma la representación actual del código en
una nueva versión que logra el mismo resultado
más eficientemente.
l Pueden aplicarse optimizaciones en diferentes
etapas de la compilación:
l durante la creación de la representación intermedia,
l durante la transformación de una representación
intermedia en otra,
l durante la traducción del código intermedio a la salida,
l luego de generar la salida,
l e incluso durante la linkedición o la ejecución.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


48
Optimización
Ejemplo
Tasa := Base + Recargo / 100 → ID := ID + ID / CTE

14. …
14. …
15. (ItoF, 100, -)
15. (/, Recargo, 100.0)
16. (/, Recargo, [15])
16. (+, Base, [15])
17. (+, Base, [16])
17. (:=, Tasa, [16])
18. (:=, Tasa, [17])
18. …
19. …
Tercetos Tercetos Optimizados

Diseño de Compiladores I - 2008 Estructura General de un Compilador


49
Generación de Código
propiamente dicho
l Se traduce la representación intermedia del
programa fuente en el código nativo de la
máquina destino.
l El código generado efectuará el chequeo de
las reglas de semántica dinámica del
lenguaje, que no pudieron ser verificadas
durante la compilación.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


50
Generación de Código Assembler
Ejemplo
Tasa := Base + Recargo / 100 → ID := ID + ID / CTE

14. … FLD, Recargo
15. (/, Recargo, 100.0) FLD, Cte1
FDIV
16. (+, Base, [15])
FLD, Base
17. (:=, Tasa, [16]) FADD
18. … FSTP, Tasa

Tercetos Optimizados Código Assembler

Diseño de Compiladores I - 2008 Estructura General de un Compilador


51
Fases de la Compilación
Errores

Tira de Lista de
tokens reglas
Programa Análisis Análisis Generación Salida
Fuente Sintáctico
Léxico de Código

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


52
Tabla de Símbolos

Es una estructura de datos que contiene un registro


para cada identificador utilizado en el código fuente,
con campos que contienen información relevante
para cada símbolo (atributos).

Diseño de Compiladores I - 2008 Estructura General de un Compilador


53
Tabla de Símbolos
l Cuando el Análisis Léxico detecta un token de
tipo identificador, lo ingresa en la Tabla de
Símbolos.
l Durante la Generación de Código se ingresa
información para los atributos de los símbolos, y
se usa esa información de diversas maneras.
l Durante la Generación de Código puede ser
necesario incorporar nuevas entradas a la Tabla
de Símbolos.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


54
Fases de la Compilación
Errores

Tira de Lista de
tokens reglas
Programa Análisis Análisis Generación Salida
Fuente Sintáctico
Léxico de Código

Tabla
de
Símbolos

Diseño de Compiladores I - 2008 Estructura General de un Compilador


55
Manejo de Errores
l Cada una de las etapas del
Compilador puede detectar errores
que son informados al programador.
l Un buen compilador no debería
terminar su ejecución al detectar un
error, sino que debería recuperarse y
continuar con la compilación.

Diseño de Compiladores I - 2008 Estructura General de un Compilador


56

También podría gustarte