Compilador2

43
compilador Fases y los aspectos formales Curso: Compilador I Alumno: José Antonio Calzada Meza Unv. José Carlos Mariátegui

Transcript of Compilador2

Page 1: Compilador2

compilador

Fases y los aspectos formales

Curso: Compilador IAlumno: José Antonio Calzada MezaUnv. José Carlos Mariátegui

Page 2: Compilador2

Índice

Ambiente de compilación, fases de un compilador. Analizador Léxico, Analizador Sintáctico, análisis semántico, generación de código, tratamiento de errores Aspectos formales, definiciones, alfabeto, símbolos, cadena de palabras, frase. Gramática o Sintaxis, producciones, símbolos terminales, símbolos no terminales. Gramática formal, árboles de derivación sintáctica

Page 3: Compilador2

Ambiente de compilación, fases de un compilador

Preparación del ambienteNaturalmente, antes de que comience cualquier trabajo de migración, necesitas disponer de todas las herramientas y bibliotecas necesarias con las que compilar. En esta sección se explicará cómo recopilar el software y cómo configurar tu sistema para compilar y ejecutar aplicaciones con el entorno GNOME 2.

fases de un compiladorAnálisis LéxicoAnálisis SintácticoAnálisis SemánticoGeneración de Código IntermedioOptimización de Código

Page 4: Compilador2

Analizador Léxico

Programa LenguajeFuente

Análisis Léxico

Mensaje de Error

(Token, Lexemaa

Lee los caracteres del programa fuente deizquierda a derecha, y los agrupa en tokens

Page 5: Compilador2

Funciones del Analizador Léxico Convierte el programa fuente en una cadena de tokens

Para reconocer el token usa un patrón, una regla que describe como se forman las cadenas que corresponden a un token.

Salta comentarios y espacios en blanco (tabuladores, saltos de línea...)

Tener el registro de la línea del archivo fuente que esta siendo analizada

Genera mensajes de error léxico, y se recupera del error Convierte los valores literales al tipo que corresponda Si la entrada debe obedecer a un formato, verifica el

formato Ej. Fortran, Cobol

Page 6: Compilador2

Tokens y Lexemas

Token:

Elemento básico del lenguaje

Unidad léxica indivisible

Identifica una entidad lógica dentro del lenguaje

Incluyen: Palabras Reservadas, Constantes, Operadores,

Signos de Puntuación e Identificadores

Lexema:

La cadena original que se identifica como token

No hay correspondencia 1-1 entre token-lexema

Page 7: Compilador2

Tokens y Lexemas: Ejemplos

Page 8: Compilador2

Porque se divide el Análisis Léxicodel Sintáctico?

Simplifica y modulariza el diseño del compilador, se hace mas claro, facilita la implementación

Mejora la eficiencia del compilador: El par ser trabaja con Tokens, no con caracteres Uso de técnicas de buffers La mayor parte del tiempo de compilación se usa

en el análisis léxico (excluyendo la optimización) Mayor portabilidad: Así la las peculiaridades en el alfabeto de entrada Ej. El conjunto de caracteres, representación de

símbolos

Page 9: Compilador2

Análisis sintáctico

Page 10: Compilador2

El papel del analizador sintáctico Obtiene una cadena de tokens desde el

analizador léxico y verifica que esta cadena

pueda ser generada por la gramática del lenguaje

de programación definido.

Programa

Fuente

Analizador

Léxico

Analizador

Sintáctico

Tabla de Símbolos

Token

ObtenToken()

Resto del análisis

Árbol de

análisis

sintáctico

Page 11: Compilador2

El papel del analizador sintáctico Conceptualmente, el analizador sintáctico, a partir de

cadenas correctas de tokens, construye un arbol de análisis sintáctico que transfiere a las etapas posteriores del compilador.

Page 12: Compilador2

El papel del analizador sintáctico De acuerdo a lo anterior, existen dos tipos

de analizadores sintácticos: Top-Down.- Construye árboles de análisis

sintáctico a partir de la raiz y hacia las hojas. Bottom-Up.- Construye árboles de análisis

sintáctico a partir de las hojas y hacia la raiz. En ambos casos la entrada es explorada

de izquierda a derecha, un símbolo a la vez.

Page 13: Compilador2

Manejo de errores sintácticos El analizador sintáctico debe ser capaz de

reconocer errores que impiden formar frases gramaticales válidas para nuestro lenguaje de programación. Ejemplos de errores sintácticos típicos son: La ausencia o exceso de un delimitador como

las llaves de C (“{“ o “}”). Una sentencia condicional if con la ausencia

de la palabra clave then en Pascal.

Page 14: Compilador2

Manejo de errores sintácticos Para recupararse de los errores sintácticos

existen las siguientes estrategias: Modo de pánico.- El analizador descarta

sucesivamente símbolos hasta encontrar un token de sincronización válido (generalmente un delimitador como el “;” o “}”).

Recuperación a nivel de frase.- El analizador intenta remplazar un prefijo de la entrada restante por una cadena que permita al analizador continuar (cambiar una “,” por un “;”, insertar un “;”, etc.).

Page 15: Compilador2

Por qué necesitamos el análisis semántico

El analizador sintáctico no puede detectar todos los errores.

Algunos constructores del lenguaje no son libres de contexto Ejemplo: declaración de identificadores y su uso. No puedes utilizar una GLC para describir que alguna

palabra particulares aparezca dos veces en una cadena separada por un texto en medio.

Una versión abstracta del problema es:{wcw | w (a | b)* }

declaración uso

Page 16: Compilador2

¿Qué hace el análisis semántico?

Verificaciones de varias clases, típicamente: Que todos los identificadores estén declarados. Los tipos de las expresiones y la compatibilidad

de las asignaciones. Invocación de métodos compatibles con las

declaraciones etc … Los requerimientos dependes del lenguaje.

Page 17: Compilador2

Generación de Código

Mantener la semántica del programa El programa traducido debe tener alta calidad: Uso efectivo de los recursos Correr eficientemente = “buen código” (generar la traducción óptima es un problema indecidible) Producir código correcto

Generador de Código

RepresentaciónIntermedia

Tabla de Símbolos

Programa TraducidoAl lenguaje destino

Page 18: Compilador2

Generador de Código

Conjuntos de instrucciones y arquitecturas de

máquina usuales: RISC (Reduced Instruction Set) CISC (Complex Instruction Set) Basada en Pila (Stack based)

Page 19: Compilador2

Generador de Código RISC (Reduced Instruction Set):

Muchos registros Instrucciones de 3 direcciones Modos de direccionamiento simples Conjunto de instrucciones simple

CISC (Complex Instruction Set): Pocos registros Instrucciones de 2 direcciones Muchos modos de direccionamiento Instrucciones de longitud variable

Basado en Pila (Stack based): Las operaciones se realizan sobre operandos que están en el tope de la pila Requiere muchas operaciones de intercambio y copia (swap, copy)

Ejemplo: JVM (Java Virtual Machine)

Page 20: Compilador2

Selección de Instrucciones

Si una instrucción de asignación de la forma x=y+z;Se traduce a: LD R0, y // R0 = y ADD R0, R0, z // R0 = R0+z ST x, R0 // x = R0

Como se traducen: a = b + c; d = a + c; a = a + 1;Que se puede optimizar? Cada instrucción de la máquina tiene un costo

asociado

Page 21: Compilador2

Localización y asignación deregistros

Localización: que variables se asignan a

registros

Asignación: establecer la relación variable-

registro

La asignación óptima es un problema NP-

Completo.

Page 22: Compilador2

Ejemplo: Lenguaje Destino

Ejemplo: Lenguaje Destino

Page 23: Compilador2

Optimización Local

Reducción usando Identidades Algebraicas: Ejemplo:

a = b + c;b = b – d;c = c + d;d = b + c;

Y se puede optimizar a:a = b + c;b = b – d;c = c + d;d = a;

Page 24: Compilador2

DEFINICIONES, ALFABETO, SÍMBOLOS, CADENA DE PALABRAS, FRASE

Aspectos formales

Page 25: Compilador2

Aspectos formales, definiciones, alfabeto, símbolos, cadena de palabras, frase

Alfabeto: es un conjunto finito y no vacío de elementos llamados símbolos

o letras. Una palabra o cadena sobre un alfabeto V es una cadena finita de

símbolos del alfabeto.

Notación:denota a una cadena de longitud 0, también conocida como palabra vacía.Vn denota al conjunto de todas las palabras de longitud n sobre VV denota al conjunto de todas las cadenas de cualquier longitud sobre V.V+ denota al conjunto de todas las cadenas de cualquier longitud sobre V,excepto la vacía.Un elemento de Vn es una cadena del tipo a1a2 : an donde cada ai 2 V.

Page 26: Compilador2

Aspectos formales, definiciones, alfabeto, símbolos, cadena de palabras, frase

Símbolos: Una tabla de símbolos es una estructura de datos que

contiene un registro por cada identificador, con los campos para los atributos del identificador. La estructura de datos permite encontrar rápidamente el registro de cada identificador y almacenar o consultar rápidamente datos en un registroCuando el analizador léxico detecta un identificador en el programa fuente, el identificador se introduce en la tabla de símbolos. Sin embargo, normalmente los atributos de un identificador no se pueden determinar durante el análisis léxico. Por ejemplo, en una declaración en Pascal como:

var posición, inicial, velocidad : real;

Page 27: Compilador2

Aspectos formales, definiciones, alfabeto, símbolos, cadena de palabras, frase

Cadena o palabras: Secuencia finita de símbolos de un alfabeto. Ejemplo:

XYZ, CASA son cadenas del alfabeto español y también del inglés pero XYZ no lo es del portugués.

Frase: Secuencia de símbolos o cadenas. Ejemplos:

Sobre el alfabeto españolEl río es azulMaría

Page 28: Compilador2

Gramática o Sintaxis

Conjunto de reglas que definen si una frase forma parte del lenguaje (es decir si está correcta o no). Si la frase está correcta entonces será aceptada por el lenguaje. Ejemplos:Considerando las reglas sintácticas del

español, frases aceptadas por el lenguaje español :

El gato es negroGato Negro

Frases no aceptadas :Está robó el negro el gato

Page 29: Compilador2

Gramática o Sintaxis

Para especificar las reglas de la gramática se usan las producciones.

Producciones : Son las reglas que definen como generar frases válidas de un lenguaje. Tienen la forma: A → B

Se lee : A está definido por B ó A puede ser sustituido por B ó B puede derivarse de A.

Normalmente se usan los símbolos → y := para especificar la transformación que originará las unas variables

Page 30: Compilador2

Producciones :

Una producción contiene: Un lado izquierdo (A) que representa la

cadena que va a transformarse (Lo que se define).

Un lado derecho (B) que representa la cadena resultante de la transformación (La definición).

Ejemplo:Oración →→→ Sujeto Verbo Predicado óOración ::= Sujeto Verbo PredicadoN → 10 ó N ::= 1

Page 31: Compilador2

Símbolos terminales :

Son las cadenas que realmente aparecen en una frase. Nunca aparecen del lado izquierdo de una producción.Para la producción N → 10 ;10 es un símbolo terminal.

La producción Oración → Sujeto Verbo Predicado no tiene símbolos terminales

T denota el conjunto de símbolos terminales de un lenguaje

Page 32: Compilador2

Símbolos no terminales :

Conocidos también como categorías sintácticas, no pertenecen a T y deben ser definidos en una producción, es decir deben aparecer por lo menos una vez del lado izquierdo de una producción. Representan los estados intermedios en el proceso de generación de un lenguaje.

en el proceso de generación de un lenguaje. La producción N → 10 ; Define el símbolo no terminal N

La producción Oración → Sujeto Verbo Predicado Define el símbolo no terminal Oración como Sujeto seguido de un Verbo y luego de un Predicado

Page 33: Compilador2

Símbolos no terminales :

N denota el conjunto de todos los símbolos no terminales del lenguaje.

Para que el lenguaje esté bien definido es necesario que todos los símbolos no terminales tengan su definición en el conjunto de producciones.

Podemos decir que un lenguaje L es el conjunto de todas las combinaciones de cadenas que se forman de acuerdo

a las reglas gramaticales (conjunto de producciones del lenguaje).

S denota el símbolo no terminal inicial, que representa el punto de partida de la gramática.

Page 34: Compilador2

El conjunto de producciones (P)

define todas las reglas para formación de frases válidas del lenguaje y podemos considerarlo la Gramática de un lenguaje.

Cualquier frase válida del lenguaje tiene que ser generada a través del uso de las producciones y se dice que pertenece al lenguaje.

Una frase que no es generada por el uso de las producciones o es generada por la aplicación inválida de las producciones, se considera una frase inválida se dice que no pertenece al lenguaje.

Page 35: Compilador2

El conjunto de producciones (P)

Se podría completar la definición del ejemplo anterior:

Sujeto → PerroVerbo → LadraPredicado → Fuerte

Podemos ahora decir que:T = { Perro, Ladra, Fuerte} N = { Oración, Sujeto, Verbo, Predicado }

La frase Perro Ladra Fuerte pertenece al lenguaje

La frase Ladra Perro Fuerte no pertenece al lenguaje

Page 36: Compilador2

Gramática Formal

Una gramática Formal G está definida por una cuádrupla G(T, N, P, S), donde:

T es el conjunto de terminales N es el conjunto de no terminales P es el conjunto de producciones

P es el conjunto de producciones S ∈ N es el símbolo inicial Cada gramática G caracteriza (genera) un

lenguaje, decimos por tanto que un lenguaje formal se asocia a una gramática:L(G) = L(T, N, P, S)

Page 37: Compilador2

Gramática Formal

Sea G0 = (T, N, P, Cadena) dondeT = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}N = { Cadena }

P = {Cadena → Cadena + Cadena Cadena - Cadena 0 1 2 3 4 5 6 7 8 9 }

Frases válidas: 1 + 56 - 49

Page 38: Compilador2

ejemplo

Sea G1 = (T, N, P, Entero) dondeT = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}N = { Entero, Signo, EnteroSinSigno,

Digito}P = {Entero → Signo EnteroSinSigno, Signo

→ + - , EnteroSinSigno → EnteroSinSigno Digito Digito, Digito → 0 1 2 3 4 5 6 7 8 9 }

Frases válidas: +10

Page 39: Compilador2

ejemplo

Sea G2= (T, N, P, Bloque) dondeT = { Begin, End, C, ; }N = { Bloque, Cuerpo, Lista, Comando}P = {Bloque → Begin Cuerpo End ,

Cuerpo → Lista ε , Lista → Lista; Comando Comando ,Comando → C }

Frases válidas: Begin End Begin C; C End

Page 40: Compilador2

Árboles de derivación o sintácticos

Muestra gráficamente como desde el no terminal S se deriva una cadena del lenguaje.

Para la producción inicial: A → C D F La raíz del árbol sería A con tres hijos C, D y F de

izquierda a derecha y luego cada símbolo no terminal ni debe ser sustuido (usando una producción cuyo lado izquierdo sea justamente ni). El proceso se repetirá en cada nodo del árbol hasta llegar a símbolos terminales (Hojas del árbol)

A

C D F

Page 41: Compilador2

Árboles de derivación

Para G0 la frase 1 + 5 tiene el siguiente árbol de derivación

Page 42: Compilador2

Árboles de derivación

Para G2 la frase Begin C; C End tiene el siguiente árbol de derivació

Page 43: Compilador2

Derivaciones

Se dice que una cadena αn se puede derivar de α0 si y sólo si existe la secuencia de cadenas α0, α1, α2 ,.. Αn tal que cada αi puede derivarse directamente de αi-1 (existe αi-1 → αi):

α0 → α1 → α2 → …. → αi-1 → αi → … → αn Podemos abreviar con el símbolo →* conocido como cerradura transitiva reflexiva de → α0 →* αn (αi-1 → αi , i = 1, 2, .., n)