lunes, 1 de abril de 2019

                                       UNIDAD 4


4.1 Funciones del analizador léxico.


Un analizador léxico aísla el analizador sintáctico de la representación de lexemas de los componentes léxicos.

Funciones:


1- Eliminación de espacios en blanco

2-reconocimiento de identificadores y palabras claves

3- Analizador léxico ”scanner” lee la secuencia de los caracteres del programa fuente, y los agrupa para formar unidades con significado propio.






El analizador léxico es la primera fase de un compilador.

Esta interacción, suele aplicarse convirtiendo al analizador léxico en una subrutina o corrutina del analizador sintáctico. Recibida la orden "obtén el siguiente componente léxico" del analizador sintáctico, el analizador léxico lee los caracteres de entrada hasta que pueda identificar el siguiente componente léxico.


Funciones secundarias.

Ciertas funciones secundarias en la interfaz del usuario, como eliminar del programa fuente comentarios y espacios en blanco en forma de caracteres de espacio en blanco, caracteres TAB y de línea nueva. Otra función es relacionar los mensajes de error del compilador con el programa fuente. Por ejemplo, el analizador léxico puede tener localizado el número de caracteres de nueva línea detectados, de modo que se pueda asociar un número de línea con un mensaje de error.

En algunos compiladores, el analizador léxico se encarga de hacer una copia del programa fuente en el que están marcados los mensajes de error. Si el lenguaje fuente es la base de algunas funciones de pre procesamiento de macros, entonces esas funciones del preprocesador también se pueden aplicar al hacer el análisis léxico.



Maigualida Pérez Melgarejo.

Bibliografía:
Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 2, p´aginas: 31-93.



4.2 Componentes léxicos patrones y lexemas

·         Léxico:


Son las unidades lógicas que genera el analizador léxico.  Formar caracteres en tokens es muy parecido a formar palabras en un lenguaje natural. 

Es el conjunto de cadenas de entrada que produce como salida el mismo componente léxico. Cada token es una secuencia de caracteres que representa una unidad de información en el programa fuente.

Los componentes léxicos más comunes son los siguientes:

Ø  palabras clave o reservadas

Ø  Operadores aritméticos

Ø  Operadores relacionales

Ø  Operadores lógicos

Ø  Operador de asignación

Ø  Identificadores

Ø  Constantes

Ø  Cadenas

Ø  Literales

Ø  Signos de puntuación

Ø  Librerías



 Patrón: Regla que describe el conjunto de lexemas que pueden representar a un determinado componente léxico en los programas fuente.

En otras palabras, es la descripción del componente léxico mediante una regla.


·  Lexema: Representan cadenas de caracteres en el programa fuente que se pueden tratar juntos como una unidad léxica.  Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el patrón para un componente léxico.



 Edgarda Santiago Reyes
Bibliografia:

4.3.-Creación de tabla de tokens.


Tabla: conjunto de pares clave-valor, llamados elementos de la tabla. La tabla de símbolos es una componente necesaria de un compilador. Al declarar un identificador (normalmente una sola vez), éste es insertado en la tabla. Cada vez que se utilice el identificador se realizará una búsqueda en la tabla para obtener la información asociada (el valor).


·         Búsqueda: dada la clave de un elemento, encontrar su valor.

·         Inserción: Dado un par clave-valor, añadir un elemento nuevo a la tabla.

·         Cambio de valor: Buscar el elemento y cambiar su valor.

·         Borrado: Eliminar un elemento de la tabla.

·         Longitud de búsqueda (o tiempo de acceso)


De una clave: Li = número de comparaciones con elementos de la tabla para encontrar esa clave. Máxima: LM = número máximo de comparaciones para encontrar cualquier clave. Media (esperada): Lm = número medio de comparaciones para encontrar un valor. 

Si la frecuencia de todas las claves es la misma:

Lm = (S Li)/N

Si la frecuencia de todas las claves no es la misma:

Lm = S pi.Li

Grado de ocupación:

s = n/N donde n=número de elementos en la tabla y N=capacidad máxima de la tabla.

Función de búsqueda: B : K→E asocia a cada clave k un elemento B(k).

Valor asociado a una clave k: v(B(k)). Puede ser múltiple, en cuyo caso normalmente se convierte en un puntero. Si está en la tabla puede almacenarse consecutivamente o en subtablas paralelas. Tablas de símbolos (identificadores) La clave es el identificador. El valor está formado por:


·         Atributos del identificador. Puntero a la posición de memoria asignada. La clave puede sustituirse por un puntero. Los identificadores pueden estar empaquetados. La longitud del identificador puede especificarse en la tabla o delante del nombre, o ser implícita.

·         Tablas consecutivas: Todos los elementos ocupan posiciones de memoria adyacentes. Tablas ligadas: cada elemento apunta al siguiente. Tablas doblemente ligadas: cada elemento apunta al siguiente y al anterior. Tablas no ordenadas Inserción: en el primer lugar vacío.


 Componentes léxicos (tokens): unidad mínima de información que significa algo a la hora de compilar; concepto de palabra; las fases de un lenguaje constan de cadenas de componentes léxicos.

Lexema: Una secuencia de caracteres de entrada que comprenden un solo componente léxico se llama lexema; cadena de caracteres que extrae el componente abstracto del componente léxico.

Patrón: Descripción de la forma que han de tomarlos lexemas para ajustarse a un componente léxico.

Ejemplo.

Marisa Martínez Bautista  
Bibliografía.

 

4.4 Errores léxicos

El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente.



Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, y éstos métodos son principalmente las expresiones regulares y los autómatas finitos. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.

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.

Suponga 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 PANICO” (este método de recuperación es donde se borra 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:
  1. Reportar clara y exactamente la presencia de errores
  2. Recuperarse de cada error lo suficientemete rápido para poder detectar errores subsiguientes:
  • Tratar de evitar mensajes falsos de error
  • Un error que produce un token erroneo
  • Errores léxicos posibles

Un token o componente léxico es una cadena de caracteres que tiene un significado coherente en cierto lenguaje de programación. Ejemplos de tokens, podrían ser palabras clave (if, while, int), identificadores, números, signos, o un operador de varios caracteres. Son los elementos más básicos sobre los cuales se desarrolla toda traducción de un programa, surgen en la primera fase, llamada análisis léxico.

Rodolfo Rodríguez Medina
Bibliografía.


4.5.-Generadores de analizadores Léxicos.

Un analizador léxico es un modo destinado a leer caracteres del archivo de entrada, donde se encuentra la cadena a analizar, reconocer subcadenas que correspondan a símbolos del lenguaje y retornar los tokens correspondientes y sus atributos.

o   Generador LEX:

Es un programa para generar analizadores léxicos, se utiliza comúnmente con el programa yacc que se utiliza para generar análisis sintáctico, escrito originalmente por Eric Schmidt y Mike Lesk, es el analizador léxico estándar de POSIX. Lex toma como entrada una especificación de analizador léxico y devuelve como salida el código fuente implementando el analizador léxico en C.


Esquema general: un programa fuente de LEX tiene el siguiente aspecto.










De estas tres secciones, solo la segunda es obligatoria, y cualquiera de ellas pueden estar vacia.

o   Generador FLEX

Es una herramienta para la generación de programas que realizan corcondancia de patrones en texto, es una herramienta para generar escanes. FLEX lee los archivos de entrada dados, o la entrada estándar si no se ha indicado ningún nombre de archivo, con la descripción de un escáner a generar. La descripción se encuentra en forma de parejas de expresiones regulares y código C, denominadas reglas.

o   Generador JTLexx


Permite expresar conjuntamente sintaxis y semántica al estilo de los esquemas de traducción.  A su vez el proceso de conjunto de atributos es implementado por JTLex por un autómata finito traductor con las ventajas de eficiencia que esto supone. Una especificación JTLex permite no solo asociar procedimiento, o acción a cada expresión regular, sino también a cada ocurrencia de un símbolo dentro de la expresión.

Esquema de funcionamiento:


Gramática:

Blanca Estela Reyes Castillo
Bibliografia.
https://prezi.com/mghu3fnrdwd7/generador-de-analizadores-lexicos/ 


                                  
4.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.








                                       UNIDAD 4 4.1 Funciones del analizador léxico. Un analizador léxico aísla el analizador s...