Categorie: Tutti - compilador - símbolos - análisis - síntesis

da María Belén Espinoza Morante mancano 4 anni

1287

Fases de un compilador

Un compilador se divide en dos fases principales: análisis y síntesis. En la fase de análisis, el programa fuente se descompone en partes más pequeñas para comprender su significado y construir una representación intermedia.

Fases de un compilador

Fases de un compilador

Bibliografía

Martínez López, F. (2015). Teoría, diseño e implementación de compiladores de Lenguajes. RA-MA Editorial.
Jiménez Millán, J. A. (2014). Compiladores y procesadores de lenguajes. Servicio de Publicaciones de la Universidad de Cádiz.
Gálvez, R. Mora, M. (2005).Taductores Y Compiladores con LEX / YACC, JFLEX/CUP Y JAVACC

Detección de errores y emisón de mensajes de error

Cada fase es capaz de detectar sus propios errores pero, luego de esto deben saber como manejarlo para continuar con la compilación y detectar más errores del programa fuente.
El analizador semántico detecta errores si las sentencias estan bien sintacticamente pero no tienen significado.
El analizador sintáctico detecta errores si los tokens violan la sintaxis (reglas gramaticales).
El analizador léxico detecta errores si los caracteres de entrada no conforman ningún token conocido.
Subtopic
Ilustración de fases de un compilador
POSICION=INICIAL+VELOCIDADA*60
Ejemplo explicativo

Interpretes vs compiladores

Intérprete
Es similar al compilador con la diferencia que la salida es una ejecución. El programa de entrada es reconocido y ejecutado a la vez. Tiene como principal ventaja que permite una fácil depuración.
Compilador
Es un traductor que como entrada tiene una sentencia en lenguaje formal y la salida es un fichero ejecutable. En si traduce un código de alto nivel a código de máquina.

Manejo de tabla de símbolos

Una función esencial de un compilador es registrar los identificadores de usuario (nombres de variables, de funciones, de tipos, etc.) utilizados en el programa fuente y reunir información sobre los distintos atributos de cada identificador.
Estos atributos pueden proporcionar información sobre la memoria asignada a un identificador, la dirección de memoria en que se almacenará en tiempo de ejecución, su tipo, su ámbito (la parte del programa donde es visible), etc.

Pues bien, la tabla de símbolos es una estructura de datos que posee información sobre los identificadores definidos por el usuario, ya sean constantes, variables, tipos u otros.

Sección de síntesis del traductor

Generador de código
Asignan variables a registros
Se traducen las instrucciones intermedias a instrucciones de máquina.
La fase final donde se genera el código de máquina.
Optimizador de código intermedio
Intenta mejorar el código intermedio para que se ejecute más rápido y ocupe menos espacio

Además de la optimización a nivel de código intermedio, se puede reducir el tiempo de ejecución de un programa actuando a otros niveles: a nivel de código fuente y a nivel de código objeto.

Generador de código interrmedio
Transforma la salida del análisis semántico, en una representación cercana a un lenguaje intermedio cercano al código objeto.

Existen varias formas de representar el código intermedio

Código de tres direcciones

Consiste en una secuencia de instrucciones, cada una con máximo tres operandos y un operador binario.

Ejemplo

Notación postfija

Árboles sintácticos

Tiene dos propiedades importante

Debe ser fácil de traducir al lenguaje objeto

Debe ser fácil de producir

Topic principal

Sección de Análisis de un traductor

Análisis Semántico
Esta fase revisa el árbol sintáctico junto con los atributos y la tabla de símbolos para tratar de encontrar errores semánticos. Para todo esto se analizan los operadores y operandos de expresiones y proposiciones. Finalmente reúne la información necesaria sobre los tipos de datos para la fase posterior de generación de código.
Análisis Sintáctico
Trabaja con una gramática de contexto libre y genera el árbol sintáctico que reconoce su sentencia de entrada. En este caso las categorías gramaticales del análisis léxico son los terminales de la gramática. Para el ejemplo que nos ocupa se parte de la gramática

S ÷ expr expr ÷ | <+> expr | <*> expr |

De manera que el análisis sintáctico intenta generar un árbol sintáctico que encaje con la sentencia de entrada.

Árbol sintáctico

El árbol puede representarse tal y como aparece en esta figura, o bien invertido.

Análisis Léxico
La primera fase de un compilador, recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de tokens (componentes léxicos) o símbolos.

Ejemplo de Tokens

Normalmente los espacios en blancos son eliminados.

Aqui el programa fuente se lee de izquierda a derecha y se agrupa en componentes léxicos, que son secuencias de caracteres que tienen un significado atómico.

Análisis del programa fuente

En esta fase, la cadena de caracteres que constituye el programa fuente se lee de izquierda a derecha y se agrupa en componentes léxicos, además el analizador léxico trabaja con la tabla de símbolos introduciendo en ésta los nombres de las variables

División en las fases de análisis y síntesis

A veces la compilación se divide en 2 fases:
La síntesis

En esta fase se hace la construcción del programa objeto a partir de la representación realizada en la fase de análisis.

El análisis

En esta fase se estudia el programa fuente fraccionándolo en pedazos para establecer el significado del mismo y construyendo una representación inmediata.