ANALISIS LEXICO

27
ANÁLISIS LÉXICO Ing. de Computación y Sistemas Autómatas y Compiladores Ing. Carlos Gaytán Toledo

Transcript of ANALISIS LEXICO

Page 1: ANALISIS LEXICO

ANÁLISIS LÉXICOIng. de Computación y Sistemas

Autómatas y CompiladoresIng. Carlos Gaytán Toledo

Page 2: ANALISIS LEXICO

Descripción Funcional

El analizador léxico o scanner lee los caracteres del programa fuente para reconocer las palabras o lexemas y clasificarlos en componentes léxicos o tokens que son entregados al analizador sintáctico.

13/04/23 2

Page 3: ANALISIS LEXICO

Descripción Funcional La compilación empieza con el analizador sintáctico

quien solicita un token para realizar su trabajo; el analizador léxico lee símbolos y envía el token correspondiente que requiere el analizador sintáctico y espera una nueva solicitud de token.

El analizador léxico está supeditado por el analizador sintáctico.

Durante estas etapas se tiene comunicación con la tabla de símbolos que concentra información de las entidades empleadas en el programa.

13/04/23 3

Page 4: ANALISIS LEXICO

Descripción Funcional

13/04/23 4

Page 5: ANALISIS LEXICO

Descripción FuncionalComponentes Léxicos o tokens

• palabras reservadas: if, while, do, break• identificadores: asociados a variables, nombres de

funciones, tipos definidos por el usuario, etiquetas,... Por ejemplo: velocidad, y11, suma, _100

• operadores: = * + - / == • símbolos especiales: ; [ ] ( ) { } ,• constantes numéricas: valores enteros, valores en coma

flotante, etc.: 982, 0xF678, -83.2E+2,...• constantes de caracteres: cadenas de caracteres, “hola

mundo”,...• Comentarios: /** abcde **/

13/04/23 5

Page 6: ANALISIS LEXICO

Descripción FuncionalOtras funciones del Analizador Léxico

• Administrar el archivo del programa fuente: abrirlo, leerlo, cerrarlo y gestionar posibles errores de lectura.

• “Eliminar” comentarios, espacios en blanco, tabuladores y saltos de línea (caracteres no validos para formar un token).

• Incluir archivos: # include ...• Expandir macros y funciones inline: # define ...• Contabilizar líneas y columnas para emitir mensajes de

error.• Reconocer las marcas de fin de archivo.• Insertar los identificadores en la Tabla de Símbolos.• Reconocer errores léxicos.

13/04/23 6

Page 7: ANALISIS LEXICO

Token, patrones y lexemas

Token: Es una unidad léxica indivisible con significado único dentro del lenguaje. Por ejemplo: Identificadores, Enteros, palabras reservadas, espacios en blanco, …

Patrón: regla que describe cómo se forma un token. Los patrones se especifican mediante expresiones regulares

Lexema: Cadena de caracteres del programa fuente que concuerda con un patrón.

Atributos: Información adicional asociada a un token y que será utilizada en el análisis semántico y/o en la etapa de síntesis

13/04/23 7

Page 8: ANALISIS LEXICO

Token, patrones y lexemas

Token Patrón Lexemasidentificador Letra seguida de letras o dígitos total, b52, i

cte_entera Digito seguido de mas dígitos 1492, 1, 512

pr_if Letra i seguida de letra f if

pr_do Letra d seguida de letra o do

op_div Símbolo / /

op_mayig Símbolo > seguido de = >=

cte_cadena Símbolos entre comillas “hola…!!!”

13/04/23 8

Page 9: ANALISIS LEXICO

Funcionamiento del Scanner

13/04/23 9

Page 10: ANALISIS LEXICO

Funcionamiento del Scanner

13/04/23 10

TK_FLOAT TK_ID(match0) TK_PARIZQ TK_CHAR TK_ID(s) TK_PARDERTK_LLAVIZQ TK_IF TK_PARIZQ TK_NOT TK_ID(strncmp) TK_PARIZQ TK_ID(s)TK_COMA TK_STRING(0.0) TK_COMA TK_NUM(3) TK_PARDER TK_PARDERTK_RETURN TK_REAL(0.0) TK_PYC TK_LLAVDER

Ejemplo:

float match0(char s) /* find a zero */{if (!strncmp(s, "0.0", 3))

return 0.0;}

Page 11: ANALISIS LEXICO

Diseño del Analizador Léxico1) Definir el conjunto de tokens que reconocerá el

Analizador.

2) Elaborar la tabla de tokens, detallando: token, código asignado al token y patrón (ER)

3) Construir un AFD para la ER asociada a cada token.

4) Combinar todos los AFDs en un único AFD mínimo equivalente cuyo DT tiene las siguientes diferencias: El DT debe leer caracteres hasta reconocer un token,

y luego retornar el token que ha reconocido El DT no puede tener estados de absorción.

13/04/23 11

Page 12: ANALISIS LEXICO

Diseño del Analizador Léxico

De los estados finales no deben salir transiciones. En el caso de los tokens no específicos, se debe leer

hasta hallar un símbolo que no forma parte del patrón. En este último estado se debe devolver al buffer de entrada el símbolo leído (que puede ser parte del siguiente token), marcando el estado con un asterisco.

13/04/23 12

0 1 0 1 20..9

0..9

0..9

0..9

otro * retornar Entero

AFD DT

Page 13: ANALISIS LEXICO

Diseño del Analizador Léxico Ejemplo:

13/04/23 13

TOKEN CODIGO E.R. ENTERO 1 -?[0-9]+SUMA 2 +2INCREMENTO 3 +++

retornar 3

retornar 1

retornar 2

retornar 2

Page 14: ANALISIS LEXICO

Diseño del Analizador Léxico

13/04/23 14

TOKEN CODIGO E.R.ENTERO 1 [0-9]+REAL 2 [0-9]+ . [0-9]+ ID 3 [a-zA-Z][a-zA-Z0-9]*SUMA 4 +RESTA 5 -MULTIPLICACION 6 *DIVISION 7 /PARIZQ 8 (PARDER 9 )

retornar 1

retornar 2

retornar 3

retornar 9

retornar 8

retornar 7

retornar 6

retornar 5

retornar 4

Page 15: ANALISIS LEXICO

Implementación del Analizador Léxico

13/04/23 15

• Aspectos a considerar para la implementación:– Estrategias de implementación– Prioridad de tokens– Reconocimiento de palabras reservadas– Gestión de errores

• Estrategias de implementación:– Programa simulador de la Tabla de Transiciones– Programa simulador del Diagrama de Transiciones– Utilización de generadores de analizadores léxicos

Page 16: ANALISIS LEXICO

Implementación del Analizador Léxico

Programa simulador de la Tabla de Transiciones• Inicializa una variable con el estado inicial y actualiza

esta variable con la información de la tabla cada vez que se lee un símbolo de entrada, hasta que se lee el ultimo carácter del lexema que está siendo analizado.

13/04/23 16

Page 17: ANALISIS LEXICO

Implementación del Analizador Léxico

13/04/23 17

Page 18: ANALISIS LEXICO

Implementación del Analizador Léxico

Programa simulador del Diagrama de Transiciones Traducción del DT a pseudo código (los estados del AFD

están implícitos en el algoritmo). Utiliza una variable para almacenar el estado actual y

una estructura tipo case doble anidada. El primer case comprueba el estado actual y el siguiente

el carácter en la entrada. Las transiciones asocian un nuevo valor a la variable

estado y avanza en la entrada. El código es largo y difícil de mantener si se introducen

nuevos caracteres en el alfabeto o nuevos estados.

13/04/23 18

Page 19: ANALISIS LEXICO

Implementación del Analizador LéxicoEstado = 0;Repite Leer siguiente símbolo de la palabra; Case estado is 1 : if símbolo == ´´+´ then estado = 3;

elsif símbolo = ´-´ then estado = 2; elsif símbolo = digito then estado = 2;

else rutine _ error; 2 : devolver símbolo; retornar SUMA; 3 : if símbolo == ´´+´ then estado = 5;

elsif símbolo = ´-´ then estado = 4; elsif símbolo = digito then estado = 4;

else rutine _ error; …

fin del case;hasta fin de cadena;

13/04/23 19

Page 20: ANALISIS LEXICO

Implementación del Analizador Léxico

Generadores de Analizadores Léxicos Son programas que generan el analizador léxico escrito en un

lenguaje de programación especifico, a partir de las expresiones regulares de los tokens y las acciones asociadas para cada expresión regular.

13/04/23 20

Page 21: ANALISIS LEXICO

Implementación del Analizador Léxico

Generadores de Analizadores Léxicos

13/04/23 21

Page 22: ANALISIS LEXICO

Implementación del Analizador Léxico

13/04/23 22

Prioridad de tokens• Reconocer el token asociado al lexema más largo– Por ejemplo: DO / DOT, el generador se quedaría con

el más largo (DOT) como identificador.– > / >=

• En generadores automáticos– Anteponer el patrón para el token más largo– Después el más corto– El lexema asociará al que esté primero

Page 23: ANALISIS LEXICO

Implementación del Analizador Léxico

Reconocimiento de Palabras Reservadas Incluir todas las PR en una tabla, y cuando el analizador léxico

reconozca un identificador, comprobar si es una PR: Si lo es, pasar al Ana. Sintáctico el código asociado a la PR. Si no lo es, es un ID, luego insertar en la TS en caso de que

no esté en ella, pasando al analizador sintáctico el token identificador y como atributo su dirección en la TS.

13/04/23 23

Page 24: ANALISIS LEXICO

Implementación del Analizador Léxico

13/04/23 24

+

- otro

: =

otro

otro

otro

otrootro0..9

0..9

0..9

0..9

.

0..9

a..z,A..Z,0..9

a..z,A..Z

* retornar EsReservada(lexema)

* retornar 2

* retornar 3

** retornar 2

* retornar 7

retornar 6

* retornar 8

retornar 9

TOKEN CODIGO E.R.ID 1 [a-zA-Z][a-zA-Z0-9]*ENTERO 2 -?[0-9]+REAL 3 -?[0-9]+ . [0-9]+ PR_WHILE 4 whilePR_WHEN 5 whenSUMA 6 +RESTA 7 -DOSPTOS 8 > OP_ASIG 9 :=

Page 25: ANALISIS LEXICO

Implementación del Analizador Léxico

Otra opción es inicializar la TS con las PR (en orden alfabético para facilitar la búsqueda). Cuando se encuentre un identificador se busca en la TS. SI lo encuentra en la zona reservada para ellas

ENTONCES es una palabra reservada; SINO, será un identificador, que, como tal, será añadido a la TS.

13/04/23 25

Page 26: ANALISIS LEXICO

Implementación del Analizador Léxico

Gestión de errores léxicos Un error léxico se detecta cuando una cadena de

caracteres no concuerda con ningún patrón. Errores típicos:

Utilizar caracteres que no pertenecen al alfabeto del lenguaje.

Escribir mal una palabra. Acciones de recuperación:

Rechazar los caracteres leídos (lexema) y volver al estado inicial o al estado final anterior si existe.

13/04/23 26

Page 27: ANALISIS LEXICO

Implementación del Analizador Léxico

Modo Pánico: ignorar los caracteres siguientes hasta leer uno que permita una transición desde el estado actual.

Acciones de recuperación inteligente: Borrar un carácter extraño. Insertar un carácter que falta. Reemplazar un carácter incorrecto. Intercambiar dos caracteres adyacentes.

13/04/23 27