Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
¿Qué es un Compilador?
Traductor: Un Traductor es un programa que toma como entrada un texto
escrito en un lenguaje, llamado fuente y da como salida otro texto en un
lenguaje, denominado objeto.
Lenguaje Lenguaje
Traductor
Fuente Objeto
Tipos de Compilación:
Compilador: es un traductor que convierte un texto escrito en un lenguaje de
alto nivel a un lenguaje de bajo nivel (código máquina).
Ensamblador: es un lenguaje de bajo nivel, donde cada sentencia del
lenguaje fuente se traduce a una instrucción en código máquina.
Intérprete: no genera código objeto, analiza y ejecuta directamente cada
proposición del código fuente.
Preprocesador: procesan un texto fuente modificándolo en cierta forma
previamente a la compilación 2
Compilador:
Un compilador presenta las siguientes características:
Programa que lee un programa fuente en un lenguaje, lo
traduce a un programa equivalente en otro lenguaje además da
mensajes de error y lleva a cabo determinadas correcciones y
puede optimizar el código generado.
Programa Programa
Compilador
Fuente Objeto
Error
3
Interprete:
Es un programa que lee un programa escrito en un lenguaje de
programación y produce el resultado de ejecutar tal programa.
Programa
Intérprete Salida
Fuente
Datos
4
Compilador vs. Intérprete
Ventajas Compilador:
* Se compila una vez, se ejecuta muchas veces.
* Produce un código optimizado.
* La ejecución del programa objeto es mucho mas rápida que si se interpreta
el programa fuente.
* El compilador tiene una visión global del programa, por lo que la
información de mensajes de error es más detallada.
* Mayor consumo de memoria
Ventajas Intérprete:
* Un Intérprete necesita menos memoria que un compilador.
* Permiten una mayor interactividad con el código en tiempo de desarrollo, lo
que facilita la búsqueda de errores.
* En algunos lenguajes está permitido es frecuente añadir código según se
ejecuta otro código.
* Menor consumo de memoria
5
Contexto de un Compilador
En el Proceso un programa fuente puede
Programa Fuente
estar dividido en módulos almacenados en ficheros
diferentes, la tarea de recopilar el código
PREPROCESADOR almacenado en estos ficheros pueden ser
encomendados a un preprocesador.
Programa Fuente Final
En el Ensamblador muchos compiladores
proporcionan el programa final en lenguaje para
COMPILADOR
poder obtener un programa ejecutable es preciso
Código Ensamblador
ensamblar este programa final con un ensamblador
convencional.
Esta herramienta toma el código máquina
ENSAMBLADOR
relocalizable de los distintos objetos compilados y
LIBRERIAS
Código Objeto en Código de librerías modifica las direcciones relocalizables
Máquina para situarlos a los valores absolutos adecuados y
ENLAZADOR
crear el programa ejecutable
Programa Final
6
Compilación
Existe 2 partes importantes en la compilación:
Compilación
Análisis Síntesis
Analizador
Léxico Independencia Física
Analizador
Sintáctico
Analizador
Semático
Administrador de la Generador de
Tabla de Símbolos Generador de Código
Código Intermedio
Generador de
Código
8
Programa Objeto
Análisis Léxico
Definición:
El analizador léxico o scanner, trasforma el texto fuente en una secuencia
ordenada de elementos léxicamente válidos (tokens).
Tipos de Tokens:
Específicos:
•Palabras Reservadas
•Separadores División de Componentes
•Operadores Programa Fuente Analizador Léxicos
Analizador
No Específicos Léxico Sintáctico
•Identificadores
•Constantes
•Etiquetas Tabla de
Estructura Simbolos
•Tipo
•Lexema
9
Análisis Léxico
Al iniciarse el proceso de compilación el código objeto es un flujo de caracteres que el analizador léxico debe reconocer y presentarlos en una
representación mas útil para el analizador sintáctico. Las funciones características del analizador léxico son:
Eliminar espacios
Ignorar comentarios
Tratar con la tabla de símbolos
Reconocer identificadores y palabra reservadas
Manejar el fichero fuente
Contabilizar posición de tokens
Procesar macros, constantes, includes…
Generar tokens bajo demanda del analizador sintáctico
10
Análisis Sintáctico
Definición:
El Analizador Sintáctico o parser recibe los tokens y comprueba su
ordenación correcta. Genera un árbol sintáctico.
Siguiente Token()
Programa Árbol
Fuente Analizador Analizador Sintáctico
TOKENS
Lexicográfico Sintáctico
Tabla de
Simbolos
12
Analizador Semántico
Definición:
Validación:
13
Tabla de Símbolos y Gestión de Errores
Tabla de Símbolo: Es el medio de almacenamiento de toda la
información referente a las variables y objetos en general del programa
que se está compilando.
14
Tipos de Analizadores Sintácticos
Analizador Descendente:
Se construye el árbol de análisis sintáctico partiendo del símbolo inicial y aplicando las producciones
mediante derivaciones por la izquierda, el símbolo a expandir es el que este más a la izquierda.
Ejemplo:
G=({+,*, ID, (, )}, {E, T, P}, E, P)
P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) }
Frase
Analizador Ascendente: ID + ( ID * ID )
Se construye el árbol de análisis sintáctico partiendo de la frase a reconocer y
aplicando las producciones mediante reducciones hasta llegar a símbolo inicial de
la gramática.
Ejemplo:
G=({+,*, ID, (, )}, {E, T, P}, E, P)
P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) }
Frase
ID + ( ID * ID )
15
Tipos de Analizadores Sintácticos
L L (1)
Es Predictivo
Descendentes Se aplican las producciones por izquierda
S L R (1)
Tipos de Es Predictivo
Analizadores Se aplican las producciones por derecha
Simple
L R (1)
Es Predictivo
Ascendentes Se aplican las producciones por derecha
Es Predictivo
Se aplican las producciones por derecha
17
Rutinas de Recuperación de Error
Estrategias :
Modo de Pánico
Método más sencillo de implementar
Utilizado por la mayoría de los analizadores sintácticos
Su sencillez está garantizada contra lazos infinitos
A Nivel de Fase
Puede corregir supuestamente cualquier error
El diseñador se encarga de elegir la correcion a utilizar
Puede caer en lazos infinitos
Producción de Error
Informa de los errores que podría corregir
No detecta todos los errores solo aquellos predeterminados en su diseño
Corrección Global
Tienen interés desde un punto de vista teórico
Se basa en el metodo de minima distancia de corrección de error
18
Analizadores Descendentes
Recursivos
Características:
Producen retrocesos
Prueban todas las posibilidades con un algoritmo de
backtracking.
Fáciles de implementar.
Analizadores predictivos:
19
Analizador LL(1)
RUTINA DE
RECUPERACIÓN DE
ERRORES
TABLA DE ANÁLISIS
MOTOR DEL PILA DE ANÁLISIS
ELEMENTOS DE UN ANALIZADOR LRANALIZADOR
1) Obtener:
1) Conjunto Primero: es el conjunto formado TABLA LL(1)
por todos los símbolos terminales que Term 1 Term 2 ... ... Term n
inician las cadenas y que se derivan del no No Terminal 1
terminal para el cual estamos calculando el No Terminal 2
conjunto .
2) Conjunto Siguiente: es el conjunto formado .
2) Elaboración de la Tabla
21
Conjunto Primero: Reglas
Si x es un Terminal y esta al inicio de la producción agregar al
Conj. Primero del no terminal para el que se calcula el Conj.
Primero ese no terminal
Prim(NT)={x}
Prim(NT)={λ}
22
Conjunto Siguiente: Reglas
Se considera el lado derecho de las producciones donde
aparezca el no terminal en cuestión y las veces en que este
aparezca:
24
Algoritmo del Analizador LL(1)
Se carga la pila con el símbolo final de la cadena y el axioma y en la cima
podemos tener:
a) un no terminal en cuyo caso se consulta a la tabla entrando a la misma
con:
25
Rutina de Recuperación de Errores
en el LL(1)
Modo de Pánico:
Se crea un conjunto de sincronización (formado por
componentes léxicos que podrían recuperar el análisis)
En el caso de error:
Se omite el error
Desecha el componente hasta que encuentre uno del conjunto
Se eliminan los elementos de la pila hasta que coincide con
la entrada y pueda proseguir el análisis y puede ocurrir que
Si se encuentra el análisis se recupera u sigue de forma
normal
Sino no hay recuperación
26
Analizador Sintáctico Ascendente LR
Características
No existe el retroceso
Esta dirigido por tablas
Su acción la decide con leer un componente
léxico (por ello se dice que es predictivo)
Se basa en el Pivote o Mango
27
Método del Pivote o Mango…
Primero encontrar en la pila de Análisis un
Prefijo viable
Es la forma de frase
Símbolo final no coincide con el final de la
parte derecha de una producción de la
gramática
El prefijo contiene todos los símbolo de parte
derecha de la producción.
28
Método del Pivote o Mango…
En cada forma de frase detectamos un mango,
una pareja
[Producción, posición de la forma de frase]
Indica a partir de que punto es
aplicable el mango en la producción
[4,4]*
29
Analizador LR
Elementos de un analizador
RUTINA DE
RECUPERACIÓN DE
ERRORES
ANALIZADOR SALIDA
ENTRADA
Lista de Producciones o
COMPONENTES LÉXICOS LR Representación implicita del árbol
PILA DE ANÁLISIS
TABLA LR
(símbolo, estado)
30
Tabla LR
ACCION Ir A
E
S
T
A Terminales No Terminales
D
O
S
31
Tabla de Simbolo LR
Acción
dn: Desplazar el símbolo de la entrada la pila
desplazar
rn: Reducción por la producción n
Aceptar: esta acción detecta el final del
análisis e indica que acepta la frase ($)
Error: detecta el error sintactico
Ir A
n: desplazar a la pila el estado n
Error: error detectado
32
Construcción del Analizador LR (1)
33
Construcción del Autómata LR(0)
Estado
Núcleo
Estados
LR(0)
Resto
34
Algoritmo para la construcción del
Autómata
1. Ampliar la Gramática S añadiendo S’S
2. Se construye el núcleo del estado 0: S’S
a) Para cada núcleo n: se fijan los símbolos cerradura, (no terminal a al
derecha de un punto en AA·Bc, B seria el símbolo cerradura)
b) Para cada símbolo de cerradura se introduce en un nuevo estado.
3. Para cada nuevo elemento se repite a y b, hasta que no se puedan
introducir nuevos elementos
4. Para cada estado cerrado nuevo (n) construyó los nucleos de nuevos
estados mediante transiciones
a) Realizo una particion del estado con una parte para cada simbolo con
estado t y otra parte con los elemtos LR(0)
b) Para cada parte de la particion correspondiente a t, se crea un nuevo
nucleo, desplazando el punto de la derecha
c) Si n es nucleo nuevo se traza una arista de n a m etiquetado con t .
35
Ejemplo
G=({a,b}, {S,B},S,P) para
P={ 0. S’S
1. SBB 1
2. BaB S’S
3. Bb}
S
0 2 5
B SBB
S’S B SBB
BaB
SBB
Bb
BaB a
a
Bb
b 3 B 6
b SaB SaB
BaB
Bb
b a
4
Bb
36
Analizadores Ascendentes(LR, LALR)
Algunos problemas no se pueden resolver de forma
descendente ya que no es tán fácil quitar la
ambigüedad. En algunos casos es más fácil demostrar
algo ya existente.
Analizador ascendente
El analizador trata de reducir la cadena de entrada w al
símbolo inicial S. En un proceso que recorre el árbol de
derivación en sentido inverso que se llama reducción.
No sólo es necesario una gramática que no presente
ambigüedades sino que también tenga el valor de k
más pequeño.
37
Analizadores Ascendentes(LR, LALR)
SLR(1): aplica las búsquedas hacia delante después de
construir el autómata de elementos LR(0)
– Mismo autómata que LR(0), sólo cambia la
construcción de la tabla.
– El autómata ignora la búsqueda hacia delante.
• La capacidad de los métodos LR(k) radica en la
construcción de un autómata que integra las
búsquedas hacia delante.
• Se utilizan nuevos elementos, denominados LR(1).
38
Análisis sintáctico LR(1) simple o
SLR(1)
Capaz de analizar prácticamente todas las construcciones
que se presentan en un lenguaje
No obstante, hay situaciones en las que no sirve y por
tanto no es analizable.
Un estado puede tener tanto reducciones como
desplazamientos
Utiliza el autómata finito determinista del LR(0) con mayor
potencia, impleando el token siguiente en la entrada para
guiar sus acciones:
Consulta el token de entrada antes de cada
desplazamiento para asegurar que existe una transición
adecuada
Utiliza el conjunto siguiente de un no terminal para decidir
si se debería realizar una reducción o no.
39
Análisis sintáctico LR(1) simple o
SLR(1)
• Una gramática es SLR(1) si es posible construir una
tabla de análisis SLR sin entradas múltiples.
• Gramática LR(1) – No es usada en la práctica debido
al gran número de estados que produce, sino que se
utiliza una gramática simplificada, LALR(1); más
potente que LR(0) pero menos que LR(1). .
• Una gramática es LALR(1) si no incluye conflictos de
análisis. Es la más importante y la que implementan
la mayoría de los generadores como CUP, Bison, y
Yacc reconocen gramáticas LALR(1).
40
Gramáticas de Atributos
Una gramática de atributos es una gramática libre de contexto
cuyos símbolos pueden tener asociados atributos y las
producciones pueden tener asociadas reglas de evaluación de los
atributos
41
Tipos de Atributos
42
Sistema de Tipos
Sistema de tipos: reglas de un lenguaje que
permiten asignar tipos a las distintas partes de un
programa y verificar su corrección
43
Sistema de Tipos
Funciones principales
– Inferencia de tipos: calcular y mantener la información sobre los tipos de
datos.
– Verificación de tipo: asegurar que las partes de un programa tienen
sentido según las reglas de tipo del lenguaje.
44
Sistema de Tipos
• Es parte de la comprobación de tipos:
– Conversión de tipos explícita: transformación del tipo de una expresión
con un propósito determinado.
– Coerción: conversión de tipos que realiza de forma implícita el
compilador.
45
Sistema de Tipos
• Comprobador de tipos seguro: Durante la compilación
(comprobación estática) detecta todos los posibles
errores de tipo.
46
Sistema de Tipos
Información de tipos dinámica: El compilador debe
generar código que realice la inferencia y verificación
de tipos durante la ejecución del programa que se
está compilando.
47
Sistema de Tipos
Un lenguaje de programación contiene un conjunto
de tipos predefinido denominados tipos simples
49
Generación de Código Intermedio
50
Generación de Código Intermedio
El código intermedio también puede ser útil al hacer
que un compilador sea mas fácilmente re dirigible: si
el código intermedio es hasta cierto punto
independiente de la maquina objetivo, entonces
genera código para una maquina objetivo diferente
solo requiere volver a escribir el traductor de código
intermedio a código objetivo, y por lo regular esto es
mas fácil que volver a escribir todo un generador de
código.
51
Generación de Código Intermedio
La representación intermedia tiene varias propiedades.
52
Lenguajes Intermedios
Árboles sintácticos abstractos (ASA)
53
Lenguajes Intermedios
Grafos dirigidos acíclicos (GDA)
El código se representa en forma de grafo
-Cada nodo no terminal representa un operador
-Cada nodo terminal representa un operando
-Se reutilizan los nodos
Más próximo al lenguaje fuente
54
Optimización de Código
La fase de optimización de código trata de mejorar el código
intermedio, de modo que resulte un código de Maquina más
rápido de ejecutar. Algunas optimizaciones son triviales.
55
Generación de Código
56