TRABAJO PRÁCTICO DE COMPILADORES Prof. Ing. Hernán García Autor: Jorge A. Vázquez Alcázar 05/10/2011
Compiladores
Jorge A. Vázquez Alcázar
INDICE. A
Análisis Léxico. ....................................................................................................................................
7, 8
B
BIOGRAFÍA .............................................................................................................................................
12
C
Como determinar donde se encuentra un LOOKAHEAD. ................................................................
5
D
DESCRIPCIÓN DEL TEMA ......................................................................................................................
3
F
FIN DE LA ENTRADA EL ANALIZADOR LÉXICO DE FORTRAN ..................................................... 7 Flex. .......................................................................................................................................................... 10 H
HERRAMIENTAS PARA LA GENERACIÓN DE ANALIZADORES LEXICOGRÁFICOS LEX, FLEX, TP LEX. ......................................................................................................................................
9
I
INTRODUCCIÓN .......................................................................................................................................
4
L
Lex. ........................................................................................................................................................... 10 LOOKAHEAD MULTICARACTER. ......................................................................................................... 5 M
Manejo de Errores. ....................................................................................................................................
8
O
Objetivos:....................................................................................................................................................
7
P
Posibles acciones: .....................................................................................................................................
8
R
RECUPERACIÓN DE ERRORES LÉXICOS. ......................................................................................... Rutina de manejo de errores. ...................................................................................................................
7 7
T
Tabla de Parseo. ...................................................................................................................................... Tipos de errores: ........................................................................................................................................ TOKEN DE ERROR. .................................................................................................................................
6 8 8
2
Compiladores
Jorge A. Vázquez Alcázar
DESCRIPCIÓN DEL TEMA
Lookahead multicaracter. Fin de la entrada el analizador léxico de Fortran: Recuperación de errores léxicos. Token de error. Herramientas para la generación de analizadores lexicográficos Lex, Flex. TP Lex
3
Compiladores
Jorge A. Vázquez Alcázar
INTRODUCCIÓN
Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Se encarga principalmente de traducir los ficheros escritos en lenguajes de programación (comprensibles para los humanos) en código máquina (unos y ceros, comprensibles generalmente sólo por los ordenadores). Son aquellos que una vez escrito el código fuente, traduce el programa entero, de una sola vez, a un programa máquina y así se puede obtener un programa ejecutable directamente sin la necesidad de un traductor. En la compilación hay dos partes análisis y síntesis . Durante el análisis se determinan las operaciones que implica el programa fuente y se registran en una estructura jerárquica llamada árbol. A menudo se usa una clase especial de árbol llamado árbol sintáctico , donde cada nodo representa una operación y los hijos del nodo son los argumentos de la operación. Un compilador típicamente opera en fases , cada una lleva a cabo una tarea sobre el programa fuente. La figura siguiente, muestra la descomposición en fases de un compilador. Las primeras tres fases suelen agruparse en una sola fase llamada fase de análisis y las últimas tres en una llamada fase de síntesis. La fase de análisis y el modulo de manejo de errores se describen posteriormente en este mismo capítulo. La fase de síntesis no es relevante en el contexto de un lenguaje multibase de datos, ya que este sigue un enfoque diferente que el de los lenguajes tradicionales, por esta razón solo se menciona. Muchas herramientas de software que manipulan programas fuente realizan primero algún tipo de análisis, entre estas se encuentran los editores de estructuras, impresoras estéticas, verificadores estáticos y los intérpretes.
4
Compiladores
Jorge A. Vázquez Alcázar
LOOKAHEAD MULTICARACTER.
Los analizadores sintácticos ascendentes construyen el árbol sintáctico a partir de las hojas, paso a paso hasta llegar a la raíz. Es decir parten de los distintos tokens de la sentencias a analizar, y por medio de reducciones llegan al símbolo inicial de la gramática. Se llaman reducciones, para indicar que se efectúan en sentido contrario a las producciones de la gramática. El principal problema que se plantea en el análisis ascendente es el del retroceso, que se traduce en la elección de un privote para realizar la reducción. Para salvar este inconveniente se definieron distintos tipos de gramáticas entres las cuales las más utilizadas son las LR(k). Los analizadores sintácticos ascendentes que reconocen lenguajes descritos por LR(k), toman sus decisiones en función de los k tokens inspeccionados por delante a lo que denominamos LOOKAHEAD. Como determinar donde se encuentra un LOOKAHEAD.
Para definir como identificar un LOOKAHEAD, utilizaremos el ejemplo de la entrada de caracteres LR(k). LR(0) y LR(1) Tanto LR(0) como LR(1) tienen el mismo engine de ejecución, la diferencia está en la construcción de la tabla de parseo. Entonces, ¿Dónde está el LOOKAHEAD? Shift sn ve el símbolo de entrada, ya sea lo consume o termina de parsear (accept o error) no es un lookahead Goto sn sólo ve el stack Reduce n LR(0) misma reducción para todos los inputs no lookahead LR(1) necesitamos el símbolo de entrada un lookahead •
–
–
–
•
–
•
–
–
5
Compiladores
Jorge A. Vázquez Alcázar
Tabla de Parseo.
ACTION
Goto
State
(
)
$
X
s0
shift to s2
error
error
goto s1
s1
error
error
accept
s2
shift to s2
shift to s5
error
s3
error
shift to s4
error
s4
reduce (2)
reduce (2)
reduce (2)
s5
reduce (3)
reduce (3)
reduce (3)
) 0 ( R L
ACTION
goto s3
Goto
State (
) 1 ( R L
)
$
X
Y
goto s5
goto s6
s0
shift to s1
reduce (5) reduce (5)
s1
shift to s2
reduce (5)
reduce (5)
goto s3
s2
shift to s2
reduce (5)
reduce (5)
goto s3
s3
error
shift to s4
error
s4
error
reduce (4)
reduce (4)
s5
error
error
accept
s6
error
error
reduce (2)
6
Compiladores
Jorge A. Vázquez Alcázar
FIN DE LA ENTRADA EL ANALIZADOR LÉXICO DE FORTRAN Análisis Léxico.
La cadena de caracteres que constituye 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 colectivo. El análisis léxico se encarga de hacer esta agrupación. Las principales funciones que realiza son: Identificar los símbolos. Eliminar los blancos, caracteres de fin de línea, etc... Eliminar los comentarios que acompañan al fuente. Crear unos símbolos intermedios llamados tokens. Avisar de los errores que detecte. Ejemplo: A partir de la sentencia en PASCAL siguiente: nuevo := viejo + RAZON*2 Genera un código simplificado para el análisis sintáctico posterior, por ejemplo: <:=> <+> <*> Nota: Cada elemento encerrado entre <> representa un único token. Las abreviaturas id y ent significan identificador y entero, respectivamente2. RECUPERACIÓN DE ERRORES LÉXICOS.
Los errores encontrados en las distintas fases de análisis se envían a un módulo denominado manejo de errores. En el caso más sencillo puede ser un subprograma al que se le invoca enviándole el código de error, y que se encarga de escribir un mensaje con el error correspondiente, y el número de línea donde se ha producido, así como de cortar el proceso de traducción. Si se desea construir un tratamiento de errores más completo, por ejemplo detectando todos los errores del programa fuente, el módulo se complica dado que los analizadores deben proseguir su trabajo con falta de datos. Rutina de manejo de errores. Objetivos: Informar con claridad, exactitud. Recuperación rápida, la recuperación no implica corrección. No debe retrasar el procesamiento de programas sin errores. No generar errores en cascada. 7
Compiladores
Jorge A. Vázquez Alcázar
Posibles acciones: Detectar errores. Informar de los errores. Recuperación de los errores. Corregir errores. Tipos de errores: Léxicos: escribir mal un identificador, número. Sintácticos: la falta de un ; al final de una sentencia o estructura incorrecta. Semánticos: multiplicar por una variable booleana. Lógicos: bucle infinito. Manejo de Errores. Cada una de las etapas del compilador puede detectar errores que son informados al programador. Un buen compilador no debería terminar su ejecución al detectar un error, sino que debería recuperarse y continuar con su ejecución. TOKEN DE ERROR. Análisis Léxico. Un TOKEN, es una secuencia de caracteres que forman una unidad significativa. Cuando el análisis léxico detecta un token de tipo identificador, lo ingresa en la tabla de símbolos. Durante la generación de códigos se ingresa información para los atributos de los símbolos y se usa esa información de diversas maneras. Palabras reservadas: IF, THEN, ELSE Operadores: +, >=, := Cadenas múltiples de caracteres: Identificador, Constante. Los tokens se deferencian de la cadena de caracteres que representan, la cadena de caracteres es el lexema o valor léxico.
Existen tokens que se corresponden con un único lexema. Por ejemplo: palabra reservada IF. Existen tokens que pueden representar lexemas diferentes. Por ejemplo: identificador plazo, identificador taza. El Análisis Léxico hace una correspondencia entre cada token y un número entero, este, entrega al Análisis Sintáctico los tokens. 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
8
Compiladores
Jorge A. Vázquez Alcázar
HERRAMIENTAS PARA LA GENERACIÓN LEXICOGRÁFICOS LEX, FLEX, TP LEX.
DE
ANALIZADORES
Los analizadores lexicográficos, como las técnicas de procesamiento de lenguajes en general, se pueden utilizar para resolver de manera simple muchos problemas que normalmente se presentan en el desarrollo de sistemas.
BibTeX es una herramienta que permite dar formato a las referencias o citaciones bibliográficas escritas en documentos LaTeX, fue creado por Oren Patashnik e Leslie Lamport en 1985 con el objetivo de facilitar la separación de la base de datos bibliográfica del texto principal del documento. Ejemplo: @inproceedings{C92,
author title booktitle year
= {Choi, E. M. and Von Mayhauser, A. }, = {Assessment of Support for Program Understanding}, = {Assessment of Quality Software Development Tools, 1992., Proceedings of the second Symposium}, = {1992}, 9
Compiladores
Jorge A. Vázquez Alcázar
isbn = {0-8186-2620-8}, pages = {102}, publisher = {IEEE Computer Society}, address = {New Orleans, DC, USA}, } Las técnicas de Análisis Lexicográfico también son útiles para construir procesadores para lenguajes tales como XML (eXtensible Markup Language). Generalmente los códigos escritos en XML son complejos de leer y analizar. Por consiguiente la construcción de procesadores de lenguajes que permitan recuperar vistas del contenido de los archivos XML son aplicaciones interesantes. Lex. Es un generador de programas diseñado para el proceso léxico de cadenas de caracteres de input. El programa acepta una especificación, orientada a resolver un problema de alto nivel para comparar literales de caracteres, y produce un programa C que reconoce expresiones regulares. Estas expresiones las especifica el usuario en las especificaciones fuente que se le dan al lex. El código lex reconoce estas expresiones en una cadena de input y divide este input. Diseño de un generador de análisis léxico Lex:
Flex. Es una herramienta para genear scanners o reconocedores, en forma de programas que reconozcan los patrones léxicos en un texto. Recibe desde la línea de comandos una descripción del scanner a ser implementado desde un archivo especificado por el usuario. La descripción del scanner está formada por pares de expresiones regulares y código C, denominadas reglas. Código Fuente en Flex
FLEX
Código C del analizador
10
Compiladores
Jorge A. Vázquez Alcázar
Flex se encarga de transformar las especificaciones (reglas y acciones) que nosotros definamos a un código C que representa al analizarlo. Reglas del reconocedor de Flex: / _ definiciones _ / %% / _ reglas _ / %% / _ código de usuario _ / Ejemplo de aplicación: basa en la obtención de datos en tiempo real de celdas de ensayos de turbopropulsores con tecnología VME y VXI, utilizando Flex y Bison para parsear ecuaciones y cálculos en tiempo real, etc. La aplicación podría presentar entre otras las siguientes características: Los datos podrían grabarse en formato XML o en cualquier otro tipo de formato propietario. Mostrar gráficas en distintas formas dependientes de las variables requeridas e interesadas en el banco de prueba. Información contínua de las señales procesadas, pudiendo apreciar las escalas de las diferentes variables implicadas. Sistema de filtros, para tratar, por ejemplo eliminar transitorios, espurios, etc. y un editor matemático que permite presentar gráficas calculadas. Sincronizar muestras con diferentes bases de tiempos e incluso datos asíncronos. Configurar el lienzo de trabajo, anotaciones, llamadas de atención, exportar a PDF, Jpg, imprimir, etc.
11
Compiladores
Jorge A. Vázquez Alcázar
BIBLIOGRAFIA.
Wikipedia Orienta Génesis LAS MISMAS.COM Autores: Pérez Rivera, Marlene Jiménez Márquez, María Del Rosario Castillo García, Brenda Berenice Gutiérrez Simon, Flavia Marisol Crespo Loto, Karina Aplicaciones de los Analizadores Léxicos. Diseño y construcción de Compiladores. Compiladores: principios, técnicas y herramientas. Escrito por: Alfred V. Aho,Ravi Sethi,Jeffrey D. Ullman Java a Tope: Traductores Y Compiladores Con Lex/yacc, Jflex/cup Y Javacc. Escrito por: Sergio Gálvez Rojas, Miguel Ángel Mora Mata.
12