Unidad 5. Análisis léxico

March 21, 2018 | Author: charitoveraa | Category: Compiler, Parsing, Programming Language, Software Engineering, Computer Programming
Share Embed Donate


Short Description

Descripción: En este trabajo de investigación se realizará un análisis sobre los conceptos básicos del análisis léxico....

Description

Índice

Introducción ...................................................................................................................................1 5.1 Funciones del analizador léxico..........................................................................................2 5.2 Componentes léxicos, patrones y lexemas ........................................................................5 5.3 Creación de Tabla de tokens ..............................................................................................6 5.4 Errores léxicos ....................................................................................................................7 5.5 Generadores de analizadores léxicos ................................................................................8 5.6 Aplicaciones (Caso de estudio) ..........................................................................................10 Conclusión .....................................................................................................................................11 Referencias bibliográficas.............................................................................................................12

Introducción En este trabajo de investigación se realizará un análisis sobre los conceptos básicos del análisis léxico.

La fase del análisis léxico de un compilador agrupa secuencia de caracteres en categorías. Aunque esto se conoce también como rastreo, realmente podemos distinguir dos tareas separadas: Un rastreador mueve un apuntador a través de la entrada un carácter a la vez para hallar cadenas continuas de caracteres, las cuales constituyen elementos textuales individuales (palabras), y clasificadas cada una de acuerdo con su tipo. El filtro descarta algunos de los tokens encontrados por el rastreador determina cuáles otros son símbolos reservados (y coloca el texto de los restantes en la tabla de nombre. Existe una gran variedad de generadores de analizadores léxico, uno de los generadores más conocidos es Lex, es un generador de analizadores léxicos para el s istema operativo UNIX basada en expresiones regulares que genera código C.

1

Análisis léxico La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de caracteres y dividirlo en tokens. Los tokens son las palabras reservadas de un lenguaje, secuencia de caracteres que representa una unidad de información en el programa fuente. En cada caso un token representa un cierto patrón de caracteres que el analizador léxico reconoce, o ajusta desde el inicio de los caracteres de entrada. De tal manera es necesario generar un mecanismo computacional que nos permita identificar el patrón de transición entre los caracteres de entrada, generando tokens, que posteriormente serán clasificados. Este mecanismo es posible crearlo a partir de un tipo específico de máquina de estados llamado autómata finito.

5.1 Funciones del analizador léxico Es la primera fase de un compilador. Su principal función consiste en leer la secuencia de caracteres del programa fuente, carácter a carácter, y elaborar como salida la secuencia de componentes léxicos que utiliza el analizador sintáctico. El analizador sintáctico emite la orden al analizador léxico para que agrupe los caracteres y forme unidades con significado propio llamados componentes léxicos (tokens). Los componentes léxicos representan: 

Palabras reservadas: if, while, do, …



Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas, …



Operadores: =, >, =, < & ¡ = …



Símbolos especiales: ; () [] {}



Constantes numéricas: literales que representan valores enteros, en coma flotante, etc, 982, 0xf678, -83.2E+2…



Constantes de caracteres: literales que representan cadenas concretas de caracteres, “hola mundo”, …

Estas serían funciones secundarias de un analizador léxico: 

Manejo del fichero de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y gestionar posibles errores de lectura.



Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea (caracteres no válidos para formar un token). Inclusión de ficheros: # include…



La expansión de macros y funciones inline: # define…



Contabilizar el número de líneas y columnas para emitir mensajes de error.



Reconocimiento y ejecución de las directivas de compilación (por ejemplo, para depurar u optimizar el código fuente).



Ventajas de separar el análisis léxico y el análisis sintáctico:



Facilita transportabilidad del traductor (por ejemplo, si decidimos en un momento dado cambiar las palabras reservadas begin y end de inicio y fin de bloque, por f y g, solo hay que cambiar este módulo.

4



Se simplifica el diseño: el analizador es un objeto con el que se interactúa mediante ciertos métodos. Se localiza en un único modulo la lectura física de los caracteres, por lo que facilita tratamientos especializados de E/S.

5.2 Componentes léxicos, patrones y lexemas En la fase de análisis, los términos componentes léxicos (token), patrón y lexema se emplean con significados específicos. Un analizador léxico, inicialmente lee los lexemas y le asigna un significado propio. 

Componente léxico es la secuencia lógica y coherente de caracteres relativo a una categoría: identificador, palabra reservada, literales (cadena/numérica), operador o carácter de puntuación, además de que un componente léxico puede tener uno o varios lexemas.



Patrón es una regla que genera la secuencia de caracteres que puede representar a un determinado componente léxico (expresión regular).



Lexema es una cadena de caracteres que concuerda con un patrón que describe un componente léxico (valor de cadena). Ejemplo de una cadena de código: const pi = 3.1416;

El analizador léxico recoge información sobre los componentes léxicos en sus atributos asociados. Los tokens influyen en las decisiones del análisis sintáctico, y los atributos, en la traducción de los tokens. En la práctica los componentes léxicos suelen tener solo un atributo. Para efectos de diagnóstico, puede considerarse tanto el lexema para un identificador como el número de línea en el que se encontró por primera vez. Esta información puede ser almacenada en la tabla de símbolos para el identificador (estructura de datos).

5

5.3 Creación de Tabla de tokens El analizador léxico, también conocido como scanner, lee los caracteres del programa fuente, uno a uno, desde el fichero de entrada y va formando grupos de caracteres con alguna relación entre sí (tokens). Cada token es tratado como una única entidad, constituyendo la entrada de la siguiente fase del compilador. Existen diferentes tipos de tokens y a cada uno se le puede asociar un tipo y, en algunos casos, un valor. Los tokens se pueden agrupar en dos categorías: Cadenas especificas, como las palabras reservadas (if, while, ...), signos de puntuación (., ,, =, ...), operadores aritméticos (+,*, ...) y lógicos (AND, OR, ...), e tc. Habitualmente, las cadenas es pecificas no tienen asociado ningún valor, sólo su tipo. Cadenas no especificas, como los identificadores o las constantes numéricas o de texto. Las cadenas no especificas siempre tienen tipo y valor. Por ejemplo, si dato es el nombre de una variable, el tipo del token será identificador y su valor será dato. A la tabla de Tokens también se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales:  Efectuar chequeos semánticos.  Generación de código. Permanece sólo en tiempo de compilación, no de ejecución, excepto en aquellos casos en que se compila con opciones de depuración. La tabla almacena la información que en cada momento se necesita sobre las variables del programa, información tal como: nombre, tipo, dirección de localización, tamaño, etc. La gestión de la tabla de símbolos es muy importante, ya que consume gran parte del tiempo de compilación. De ahí que su eficiencia sea crítica. Aunque también sirve para guardar información referente a los tipos creados por el usuario, tipos enumerados y, en general, a cualquier identificador creado por el usuario. Una tabla de símbolos puede conceptualizarse como una serie de renglones, cada uno de los cuales contiene una lista de valores de atributos que son asociados con una variable en particular. Las clases de los atributos que aparecen en una tabla de símbolos dependen en algún grado de la naturaleza del lenguaje de programación para el cual se escribe el compilador. La organización de la tabla

6

variará dependiendo de las limitaciones de memoria y tiempo de acceso. Una tabla de símbolo provee la siguiente información: 

Da un identificador.



Que información es asociada con un nombre.



Como se asocia esa información con un nombre.



Como acceder esta información.

Pero las dos funciones importantes que realizan las tablas de símbolos (también llamadas tablas de identificadores y tablas de nombres), en el proceso de traducción son: o verificar que la semántica sea correcta o ayudar en la generación apropiada de código.

Cuando construir la tabla de símbolos y cuando interactuar con ella El punto del procesador de traducción en el cual son invocadas las rutinas de manejo de la tabla de símbolos depende primeramente del número y la naturaleza de los pasos del compilador. En un compilador multipasos, la tabla de símbolos es creada durante el paso de análisis léxico. Por medio de un índice se entra a la tabla de símbolos para ubicar la variable, a partir del token generado por el scanner.

5.4 Errores léxicos Son pocos los errores simplemente en el nivel léxico ya que tiene una visión muy restringida de un programa fuente. El analizador léxico debe devolver el componente léxico de un identificador y dejar a otra fase se ocupe de los errores. Suponiendo que una situación en la cual el analizador léxico no puede continuar por que ninguno de los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de recuperación más sencilla sea recuperación “EN MODO PÁNICO” (este método de recuperación es donde se borra

7

caracteres sucesivos de la entrada hasta que el analizador léxico pueda encontrar un componente léxico bien formado). ¡Los programas no siempre son correctos! El compilador tiene que realizar lo siguiente: 1. Reportar clara y exactamente la presencia de errores 2. Recuperarse de cada error lo suficientemente rápido para poder detectar errores subsiguientes: 

Tratar de evitar mensajes falsos de error



Un error que produce un token erróneo



Errores léxicos posibles

5.5 Generadores de analizadores léxicos Todos los analizadores léxicos realizan la misma función (se implementan de igual forma) excepto en los tokens que reconocen, las expresiones regulares que los definen. Resulta entonces natural y una forma de ahorrar esfuerzo, utilizar generadores automáticos de analizadores léxicos. Estos generadores solo necesitan conocer la especificación de tokens a reconocer. Los analizadores léxicos (el AFD) se pueden implementar a mano para reconocer los componentes léxicos de un determinado lenguaje. Este opción tiene sentido solo cuando el aprender a utilizar una determinada herramienta nos llevaría más tiempo que el hacerlo nosotros a mano. Originalmente, esta era la forma habitual, pues los realizados a mano eran más rápidos que los generados por las herramientas automáticas (basados en tablas). (el proceso de análisis léxico conlleva la mayor parte del tiempo del proceso de compilación). Las ´ultimas herramientas con las técnicas de compresión de tablas son más eficientes. Flex (Fast Lexical Analyzer Generator) es un generador automático de analizadores léxicos en lenguaje C. Es software de GNU. 

Entrada: un fichero texto con la especificación de los componentes léxicos, las expresiones regulares que los definen.

8



Salida: un programa en C que implementa dicho analizador, preparado para ser compilado y utilizado.

Un fichero Lex consiste de tres partes: definiciones, reglas y rutinas auxiliares, separadas por % %.

La sección de definiciones incluye declaraciones de variables, constantes y definiciones regulares que pudieran ser utilizadas más adelante. La sección de reglas describe cada patrón y cada acción es un fragmento de código que indica la acción que se debe realizar cuando se encuentra dicho patrón. La sección de código auxiliar contienen las funciones que pueden ser llamadas por las acciones de la sección de reglas. Algunas consideraciones: 

Cualquier código C que se desea insertar va comprendido entre %{ y %}.



Flex hace correspondencia siempre con la cadena más larga.



Si se verifican dos patrones, se elige la regla que aparece primero (colocar las palabras reservadas antes que los identificadores).



Para definir las expresiones regulares se utiliza los símbolos:

9



Existen los siguientes nombres internos:

5.6 Aplicaciones (Caso de Estudio) Además de para construir compiladores e intérpretes, los analizadores léxicos se pueden emplear para muchos programas \convencionales". Los ejemplos más claros son aquellos programas que tienen algún tipo de entrada de texto donde hay un formato razonablemente libre en cuantos espacios y comentarios. En estos casos es bastante engorroso controlar donde empieza y termina cada componente y es fácil liarse con los punteros a char. Un analizador léxico simplifica notablemente la interfaz y si se dispone de un generador automático, el problema se resuelve en pocas líneas de código.

10

Conclusión

El analizador léxico tiene varias funciones importantes, se encarga de la eliminación de los espacios en blanco de cualquier cadena que analiza, reconoce los identificadores y palabras claves y contantes. Posteriormente se encarga de construir los lexemas que constituyen un lenguaje de programación. Las funciones en general de un análisis léxico es leer el programa fuente como un archivo de caracteres y dividirlo en tokens. Los tokens son palabras reservadas de un lenguaje, secuencia de caracteres que representa una unidad de información en el programa fuente.

11

Referencias bibliográficas

Hopcroft John E., Introducción a la Teoría de Autómatas, Lenguajes y Computación, 2da ed, Ed. Addison Wesley, 2004. Kenneth C. Louden. (2004). Construcción de compiladores: principios y práctica. México: Thomson. Méndez, J. (2011) “Unidad III y IV Lenguajes y Autómatas i”. Documento en línea. Consultado el 19 de noviembre de 2016 en: https://es.scribd.com/doc/226694899/Unidad-III-y-IV-Lenguajes -yAutomatas-i Rosario, K. (2009) “Análisis Léxico”. Documento en línea. Consultado el 19 de noviembre de 2016 en: http://automatas-finitos.blogspot.mx/2009/12/clasificacion.html

12

View more...

Comments

Copyright ©2017 KUPDF Inc.