ANALIZADOR LEXICO 1
Funcionamiento del A.L. Programa fuente Analizador léxico Componente léxico Obtén el siguiente componente léxico Analizador sintáctico Tabla de símbolos 2
Maneja el fichero del programa fuente: abrir, leer y cerrar. Gestionar posibles errores de lectura. Genera tokens en base a la demanda. 3
Funciones Rechaza cualquier texto en el que aparezcan caracteres ilegales ( alfabeto) Rechaza combinaciones ilegales (no permitidas por las especificaciones léxicas). 4
El A.L. ignora elementos innecesarios para la siguiente fase, como tabuladores, comentarios, espacios en blanco, etc. 5
Sitúa el error en el programa fuente. Lleva la cuenta de las líneas procesadas. Devuelve el par (token, lexema). 6
Ejemplo 7
Para algunos tipos de tokens debe leer caracteres hasta que lea uno que no pertenece a la categoría del token que se está leyendo. Este es devuelto al buffer de entrada 8
Ejemplo En la cadena Grande / 307>= identificador ver si no es prefijo de ningún otro Debe tratar de leer el token mas largo 9
Recuperación de errores Ignorar los caracteres no válidos hasta formar un token válido. Borrar caracteres extraños. Insertar un carácter que pudiera faltar. Reemplazar un carácter presuntamente incorrecto por uno correcto. Conmutar las posiciones de dos caracteres adyacentes 10
Conceptos Lexema Secuencia de caracteres que concuerda con un patrón numerousuarios Atributos Estructura de datos de cada token para almacenarse en la TS [puntero, Lexema, Tipo, línea] Patrón - Descripción del componente léxico mediante una regla.
Reconocimiento de palabras reservadas Resolución implícita Considerar las palabras reservadas como identificadores Insertar las palabras clave como tal en la tabla de símbolos Buscar identificadores en la tabla de símbolos Resolución explícita Se indican todos los patrones de cada palabra reservada Se integran en el diagrama de transiciones global 12
Tabla de Símbolos do end for while cont Pal. reservada Pal. reservada Pal. reservada Pal. reservada Identificador Zona de Palabras Reservadas Zona de identificadores 13
Especificación de A.L Identificar la colección de tokens Estructurar la colección de tokens Describir el lenguaje como expresiones regulares Especificar un Diagrama de Transición Traducir el Diagrama a una tabla de transición 14
ESPECIFICACIÓN DEL FUNCIONAMIENTO 15
Lex (Lexical Analyzer Generator) La herramienta es llamada el compilador Lex, Flex Su especificación de entrada el lenguaje Lex(c,c++).
Herramienta Lex Se crea mi_especificacion.lex utilizando el lenguaje Lex mi_especificacion.lex es procesado utilizando el compilador Lex para producir un programa C llamado lex.yy.c. El programa lex.yy.c contiene una representación de un diagrama de transición construido a partir de las e.r. de mi_especificacion.lex, y una rutina estándar llamada yylex() que usa la tabla para reconocer lexemas.
lex.yy.c es procesado utilizando un compilador C para producir un programa objeto mi_analizador_lex.exe el cual es el analizador lexicográfico, que transforma la entrada (mi_programa.c) en una secuencia de tokens.
mi-especificacion.lex (programa fuente lex) Compilador lex (mi_especificacion.lex) Lex.yy.c Lex.yy.c Compilador C (cc lex.yy.c) Mi_analizador_lex.exe Mi_programa.c (archivo fuente) Mi_analizador_lex.exe Secuencia de tokens Éste es el analizador lexicográfico
Especificaciones Lex Consiste de tres partes o secciones: 1. Definiciones auxiliares 2. %% reglas de traducción %% 3. rutinas definidas por el usuario (opcional)
1. Definiciones Auxiliares Pueden ser de dos tipos: Fragmentos de declaraciones y/o código en lenguaje C delimitado por%{ y%} e incluyen declaraciones de variables, constantes, etc. Las declaraciones involucradas tendrían alcance global en el programa fuente generado. %{... %} Definiciones de expresiones regulares de la siguiente manera: R1 D1 R2 D2...... Rn Dn donde Dj <> Di (Para todo i<> j) y Ri es un e.r
2. Reglas de traducción R1 {acción1} R2 {acción2}...... Rm {acciónm} Donde Ri es una e.r llamada patrón {acción i} es un fragmento de código C que describe la acción Que el analizador realizará al momento de reconocer el patrón Ri.
Funciones de Lex Dentro de las acciones y dentro de la sección rutinas definidas por el usuario. input() Toma el siguiente caracter en la entrada. output(c) Escribe el contenido de c en la salida. yytext[] Secuencia de caracteres que unifican con un patrón. yyleng Longitud de la secuencia de caracteres en yytext[].
3. Funciones definidas por el usuario Pueden incluir rutinas que permitan modularizar, simplificar la complejidad y reutilizar código en el diseño de las acciones.
Ejemplo Declaraciones %{ int palabra=0, numero=0; %} Definiciones e.r. Numero [0-9]+ Palabra [a-za-z]+ %% "bye {bye();return 0;} "quit {bye();return 0;} "resume" {bye();return 0;} {Palabra} {printf("se leyo la palabra : %s", yytext);palabra++;} {Numero} {printf("se leyo el numero : %d", atoi(yytext));numero++;}. printf("%s",yytext[0]); %% main(){ printf("ejem1.l\neste ejemplo, distingue entre un numero entero y palabras.\nintroduzca bye, quit o resume para terminar.\n"); yylex(); } bye() { printf("se leyeron %d entradas, de las cuales se reconocieron\n%d\tenteros\ny\n%d\tpalabras.\n", (palabra+numero), numero, palabra); } Reglas Funciones
Tarea 4 Checa las antologías de Lex en la página e investiga más acerca del lenguaje
DIAGRAMA DE TRANSICIÓN Un DT debe leer caracteres hasta completar un token, y retornarlo (en los estados de aceptación) En un DT se considerará que las entradas para las que no hay transición desde cada estado son error. 27
De los estados de aceptación de un DT no deben salir transiciones. En el caso de tiras no especificas, se necesita otro estado al que ir cuando se lea un carácter que no pueda formar parte del patrón. Estados con retroceso. 28
Simbología x 29
Ejemplo expresión regular [0-9]+ = digito+ entero 30
Ejemplo 1 Construir un diagrama de transiciones para el reconocimiento de números enteros con signo negativo o sin signo y los operadores suma ( + ) e incremento ( ++ ) 31
DT 1 - d 7 5 d t 6 * Entero + 2 d + t 4 Incremento = {dígitos,+,-} Notación: d = dígito t = otro (ER: (- ε) d+ 36 * Suma 32
Ejemplo 2 Construir un diagrama de transiciones para el reconocimiento de: Identificadores (empieza con letra y puede llevar más letras ó dígitos) números enteros sin signo palabras reservadas do y done. 33
= {dígitos, letras,+,-} Notación d = dígito l = letra d 1 a 2 l d f 4 6 2 a 3 d l t t 3 5 DT d 8 * Do t o n e t t * Identificador * Entero t = otro f = otro alfanumérico (dígito o letra) a n = ir al estado n (ER: l (l d)* 7 9 10 11 f t f f a 2 a 2 a 3 a 2 * Done 34
Implementación del A.L. Esto es a través de la construcción de una Tabla de Transiciones. Las filas se etiquetan con los estados del DT. Las columnas se etiquetan con las posibles entradas. Notación: 0 significa ERROR - significa estado de aceptación 35
L d d o n e t 1 2 4 6 2 2 2 0 2 2 2 2 2 2 2 3 3 - - - - - - - 4 5 4 5 5 5 5 5 5 - - - - - - - 6 2 2 2 7 2 2 3 7 2 2 2 2 9 2 8 8 - - - - - - - 9 2 2 2 2 2 10 3 10 2 2 2 2 2 2 11 11 - - - - - - - *Ident. *Entero *Do *Done 36
A.L. Estado= TablaTransiciones[Estado, Entrada] El A.L. intentará llegar a un estado de aceptación. Ejemplo: hola 29 done dos 37
Tabla de Análisis 1 h 2 2 O 2 2 L 2 2 A 2 2 \n 3 *Ident. 1 \n Ignora 1 2 4 4 9 4 4 \n 5 *Entero 1 \n Ignorar 1 d 6 6 o 7 7 n 9 9 e 10 10 \n 11 *Done 1 \n Ignora 1 d 6 6 o 7 7 s 2 2 EOF 3 *Ident. 38
Practica 5 Ejercicio 1: Construir un diagrama de transiciones para el reconocimiento de operadores relacionales: <, <=, < >, =, >=, > Ejercicio 2: Construir un diagrama de transiciones para el reconocer números en notación científica ejemplo ± 3 e ± 5, puede o no llevar signo en la base y en la potencia 39
Ejercicio 3: Construir un diagrama de transiciones para el reconocer números reales en los que puede o no llevar el signo y antes del punto puede o no llevar dígitos pero después del punto debe de llevar al menos un punto. Ejercicio 4: Construir un diagrama de transiciones para reconocer las siguientes estructuras while y for en su forma mas común para el lenguaje c. 40
Ejercicio 5: Construir un diagrama de transiciones para el reconocer operaciones aritméticas con los operadores +,-,* y /. Ejercicio 6: Construir un diagrama de transiciones para reconocer los siguientes componentes léxicos read, print, palabras reservadas pradir, redir, ident, raya (_), punto (. ) 41
Ejercicio 7: Construir un diagrama de transiciones para reconocer expresiones lógicas con operadores lógicos and, or, not. 42
8. Para los ejercicios en los que desarrollaste el DT, ahora desarrolla la TT correspondiente a cada uno. 43
Desarrollar DT TT Ejercicio 9 para reconocer números binarios (Terminan en B), decimales (terminan en D), octales (terminan en O) y hexadecimales (terminan en H ) e identificadores Analizar el archivo fuente 355555O 34678D sumab 355555H34678H 1253612B contd 1010101010B 10101010D 101010O 1010101010H 3AFH 01123H temph 44