Tema 2. Análisis léxico

Documentos relacionados
SSL Guia de Ejercicios

1. Cadenas EJERCICIO 1

Tema 3: Gramáticas regulares. Teoría de autómatas y lenguajes formales I

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES Práctica 5 - Simplificación de gramáticas incontextuales

16 Análisis sintáctico I

Tema: Autómatas de Estado Finitos

TEMA 6 GRAMÁTICAS INDEPENDIENTES DEL CONTEXTO

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Una cadena sobre Σ es cualquier secuencia de elementos de longitud finita sobre Σ.

Compiladores e intérpretes Análisis Léxico I. Análisis Léxico I

El proceso del Análisis Léxico

No todos los LRs finitos se representan mejor con ERs. Observe el siguiente ejemplo:

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Temas. Objetivo. Que el estudiante logre: 1) Identificar conceptos constructivos de la Teoría de la Computabilidad. 2) Definir autómatas de pila.

Generación de Código Intermedio

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular.

Autómatas Deterministas. Ivan Olmos Pineda

Elementos de un programa en C

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

EJERCICIOS del TEMA 3: Lenguajes independientes del contexto

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

4. Operadores Operador asignación

Procesadores de lenguaje Tema 2 Análisis léxico

Unidad II: Análisis semántico

El lenguaje C. 1. Identificadores, constantes y variables

Tema 2: Los Autómatas y su Comportamiento

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

Escribir la expresión regular de un número entero que no acepte que el primer dígito sea cero salvo el número 0. Solución: 0 [1-9][0-9]*

Teoría de Autómatas y Lenguajes Formales, IS17 Ingeniería Técnica en Informática de Sistemas. Práctica 1: Introducción al Analizador Léxico FLEX

Convertir un AFND a un AFD

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

Tema 4: Análisis sintáctico ascendente. Análisis sintáctico ascendente: un ejemplo

GRAMATICAS LIBRES DEL CONTEXTO

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas

PROGRAMACIÓN II AÑO 2009 TALLER 3: TEORÍA DE LENGUAJES Y AUTÓMATAS

PHP: Lenguaje de programación

Representación de la información

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4

Autómatas de Pila y Lenguajes Incontextuales

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

FUNDAMENTOS DE INFORMÁTICA

Datos y tipos de datos

Capítulo 1 Lenguajes formales 6

Cualquier lenguaje de contexto libre, L, puede ser generado por medio de una GCL, G, que cumpla las siguientes condiciones:

Lenguaje de programación C. Introducción

Programación en Lenguaje C

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Tema 7. Generación de código

Tema 2. El lenguaje JAVA

Capítulo 7: Expresiones Regulares

Expresiones Lógicas y Operadores sobre Bits

4 o Ingeniería Informática

Problemas propuestos. Simplificar las siguientes expresiones lógicas

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES Grado en Ingeniería Informática Online, Curso Universidad Rey Juan Carlos

Principios de Computadoras II

Capítulo 9. Introducción a los lenguajes formales. Continuar

Lección 2 Introducción al lenguaje C

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Fundamentos de JAVA. Angel Kuri Enero, /2/2006

Maquina de Turing. 5. Fundamentos de algoritmos. Turing TURING TURING 10/08/2010. MI Elizabeth Fonseca Chávez

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Construcciones del Lenguaje Java

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

CONJUNTOS REGULARES. Orlando Arboleda Molina. 19 de Octubre de Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle

como les va con las practicas?

Autómatas Finitos y Lenguajes Regulares

Clase 09: AFN, AFD y Construcción de Thompson

Expresiones regulares, gramáticas regulares

LENGUAJE. Tema 2 Elementos de un programa

Tema: Autómata de Pila

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

Computación II. Introducción a Visual Basic

autómatas finitos y lenguajes regulares LENGUAJES FORMALES Y

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

Operadores y Expresiones

Las Etapas de la Compilación

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Departamento de Tecnologías de la Información. Tema 4. Máquinas de Turing. Ciencias de la Computación e Inteligencia Artificial

2. EXPRESIONES 3. OPERADORES Y OPERANDOS 4. INDENTIFICADORES COMO LOCALIDADES DE MEMORIA

Elementos léxicos del lenguaje de programación C

Expresiones y sentencias

GRAMÁTICAS LIBRES DE CONTEXTO

12 La herramienta LEX

Teoría de Autómatas y Lenguajes Formales. Introducción a las Gramáticas. Gramáticas incontextuales

III. Generación de Código orientado a objetos

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Autómatas Finitos Deterministicos (DFA)

Expresiones y sentencias

Autómatas Finitos Deterministicos (DFA)

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Ficha de Aprendizaje N 13

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

PROPIEDADES DE LOS CAMPOS. Cada campo de una tabla dispone de una serie de características que proporcionan un control

Transcripción:

Departamento de Tecnologías de la Información Tema 2 Análisis léxico Ciencias de la Computación e Inteligencia Artificial

Índice 2.1 Introducción 2.2 Especificación de categorías léxicas 2.3 Autómatas Finitos No Deterministas 2.4 Autómatas Finitos Deterministas 2.5 Implementación de un analizador léxico 2

Índice 2.1 Introducción 2.2 Especificación de categorías léxicas 2.3 Autómatas Finitos No Deterministas 2.4 Autómatas Finitos Deterministas 2.5 Implementación de un analizador léxico 3

2.1 Introducción 2.1.1 Características del análisis léxico Lee caracteres. Produce componentes léxicos (tokens). Filtra comentarios. Filtra separadores múltiples (espacios, tabuladores y saltos de línea). Lleva el contador de línea y columna del texto fuente. Genera errores en caso de que la entrada no corresponda a ninguna categoría léxica. 4

2.1 Introducción Categoría léxica: 2.1.2 Algunas definiciones Tipo de símbolo elemental del lenguaje fuente, (identificadores, palabras clave, constantes numéricas, operadores,...). Componente léxico (token): Elemento perteneciente a una categoría léxica. Atributos de un componente: Información del componente necesaria en etapas posteriores del análisis (valor de la constante, nombre de una variable,...). Lexema: Cadena de caracteres correspondiente al componente léxico. 5

2.1 Introducción Palabras clave: 2.1.3 Categorías léxicas más habituales Palabras con un significado especial en el lenguaje (if, then, else, for, while, do, switch, case,...) Suelen ser palabras reservadas. Identificadores: Nombres de variables, de constantes, de funciones, de tipos... ( media, valor0, i1, _PI,...) Operadores: Símbolos que identifican operaciones aritméticas y lógicas. ( +, -, *, /, %, =, ++, --, +=, -=, *=, /=, ==,!=, &&,, &,,...) 6

2.1 Introducción 2.1.3 Categorías léxicas más habituales Constantes numéricas: Literales que especifican valores numéricos (325, 3.141592, 0xA3F2, 0.2e+3) Constantes de carácter o cadenas: Literales con el valor de un carácter o de una cadena ( z, \n, ejemplo de cadena,...) Símbolos especiales: Separadores, delimitadores, terminadores, etc. ( {, }, [, ], (, ), ;,, ) 7

2.1 Introducción Blancos: 2.1.3 Categorías léxicas más habituales Caracteres de separación de componentes léxicos (espacios, tabuladores, saltos de línea) El análisis léxico se limita a suprimirlos. Comentarios: Información para el lector del programa. ( /* comentario multilínea */, // comentario de una línea \n, /** comentario para la documentación */ ) - El análisis léxico los elimina. Fin de entrada: Componente ficticio que indica el final de lectura. 8

Índice 2.1 Introducción 2.2 Especificación de categorías léxicas 2.3 Autómatas Finitos No Deterministas 2.4 Autómatas Finitos Deterministas 2.5 Implementación de un analizador léxico 9

2.2 Especificación de categorías léxicas Tipos de producciones: 2.2.1 Gramáticas regulares <A> a <B> <A> a <A> l Ejemplo: números enteros <S> 0 <S> <S> 5 <S> <S> 0 <S> 5 <S> 1 <S> <S> 6 <S> <S> 1 <S> 6 <S> 2 <S> <S> 7 <S> <S> 2 <S> 7 <S> 3 <S> <S> 8 <S> <S> 3 <S> 8 <S> 4 <S> <S> 9 <S> <S> 4 <S> 9 10

2.2 Especificación de categorías léxicas Notación simplificada 2.2.1 Gramáticas regulares <S> 0 <S> 1 <S> 2 <S> 3 <S> 4 <S> 5 <S> 6 <S> 7 <S> 8 <S> 9 <S> <S> 0 1 2 3 4 5 6 7 8 9 Ejemplo: palabra clave protected <S> p <A1> <A1> r <A2> <A2> o <A3> <A3> t <A4> <A4> e <A5> <A5> c <A6> <A6> t <A7> <A7> e <A8> <A8> d Ejemplo: identificador <S> a <A> b <A> c <A> d <A>... A <A> B <A> C <A> D <A>... <A> a <A>... Z <A> 0 <A>... 9 <A> a... Z 0... 9 11

2.2 Especificación de categorías léxicas 2.2.2 Expresiones regulares Concatenación de lenguajes L y M LM = { xy x L y M } Notación: L k = L concatenado consigo mismo k-1 veces L 0 = { l } L 1 = L Clausura de L Conjunto de cadenas que pueden obtenerse concatenando un número arbitrario de cadenas de L L* = U L k k= 0 12

2.2 Especificación de categorías léxicas 2.2.2 Expresiones regulares Ejemplos: L = { a, b, c } M = { x, y, z } LM = { ax, ay, az, bx, by, bz, cx, cy, cz } L 3 = { aaa, aab, aac, aba, abb, abc, aca, acb, acc, baa, bab, bac, bba, bbb, bbc, bca, bcb, bcc, caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc } L* = { l, a, b, c, aa, ab, ac, ba, bb, bc, ca, cb, cc, aaa,... } 13

2.2 Especificación de categorías léxicas 2.2.2 Expresiones regulares Expresión regular f: lenguaje vacío L f = f Expresión regular l: lenguaje de la cadena vacía L l = { l } Expresión regular a (con a S): lenguaje L a = { a } Expresión regular rs: lenguaje L r L s Expresión regular r s: lenguaje L r U L s Expresión regular r*: lenguaje (L r )* 14

2.2 Especificación de categorías léxicas 2.2.2 Expresiones regulares Ejemplos: ( a b )* = { l, a, b, aa, ab, ba, bb, aaa, aab, aba, abb,... } nº enteros : ( 0 1 2 3 4 5 6 7 8 9 )* nº enteros : ( ( 1 2 3 4 5 6 7 8 9 ) ( 0 1 2 3 4 5 6 7 8 9 )* 0 ) nº reales : ( 0 1 2 3 4 5 6 7 8 9 )* (. ( 0 1 2 3 4 5 6 7 8 9 )* l ) 15

2.2 Especificación de categorías léxicas 2.2.2 Expresiones regulares Abreviaturas (expresiones regulares extendidas): [ a, f, j ] = ( a f j ) (los corchetes representan opciones) [ 0-9 ] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] (el guión indica intervalo) [ 0-9, a - z, A - Z, _ ] (puede aparecer más de un guión entre corchetes) r+ = rr* (el signo + indica clausura positiva) r? = (r l) (el signo? indica opcionalidad) ~[ 0-9 ] = cualquier carácter excepto un dígito (el símbolo ~ significa caracteres excluidos) ~[] = cualquier carácter 16

2.2 Especificación de categorías léxicas 2.2.2 Expresiones regulares Ejemplos: Identificadores: [ a - z, A - Z, _ ][ a - z, A - Z, 0-9, _ ]* Números enteros: ( [ 1-9 ][ 0-9 ]* 0 ) Números reales: [ 0-9 ]+ (. [ 0-9 ]+ )? Números hexadecimales: 0x [ 0-9, a - f, A - F ]+ Comentarios en C: /* ( ~[ * ] ( * )+ ~[ *, / ] )* ( * )+ / Palabras clave: if then else 17

Índice 2.1 Introducción 2.2 Especificación de categorías léxicas 2.3 Autómatas Finitos No Deterministas 2.4 Autómatas Finitos Deterministas 2.5 Implementación de un analizador léxico 18

2.3 Autómatas Finitos No Deterministas 2.3.1 Reconocedores de lenguajes regulares Un reconocedor de lenguaje es un programa que toma como entrada una cadena y devuelve verdadero o falso en función de si la cadena pertenece o no al lenguaje. Los lenguajes regulares (descritos por gramáticas regulares o por expresiones regulares) pueden ser reconocidos por medio de Autómatas Finitos (Finite State Machines) Existen dos tipos de Autómatas Finitos: Autómatas Finitos No Deterministas (AFN) Autómatas Finitos Deterministas (AFD) 19

2.3 Autómatas Finitos No Deterministas Quintupla: (Q, S, E, q 0, F) 2.3.2 Definición de AFN Q: Conjunto finito de estados S: Alfabeto de símbolos E: Conjunto de arcos (Q S Q) que representan transiciones entre estados ante un determinado símbolo (incluido l) q 0 : Estado inicial (q 0 Q) F: Conjunto de estados finales (F Q) 20

2.3 Autómatas Finitos No Deterministas Representación gráfica: 2.3.2 Definición de AFN Estado: A a l Arco: A B A B Estado final: A [ a - z ] ~[ + ] Arcos agrupados: A B A B 21

2.3 Autómatas Finitos No Deterministas 2.3.2 Definición de AFN Ejemplo: binarios cuyo tercer último dígito es un 0 0 0 0 0 A B C D 1 1 1 Ejemplo: cadenas formadas por a o cadenas por b a l 1 a 2 0 l 3 b b 4 22

2.3 Autómatas Finitos No Deterministas 2.3.3 Funcionamiento de un AFN Camino: lista de estados en la que a partir de cada estado se puede llegar al siguiente por medio de una transición del autómata. Cadena aceptada x: si existe un camino que parta de q 0, acepte la entrada x y termine en un estado final. Lenguaje reconocido por el autómata: conjunto de cadenas aceptadas En un AFN, dada una cadena pueden existir varios caminos. Una cadena es aceptada si al menos uno de los caminos conduce a un estado final 23

2.3 Autómatas Finitos No Deterministas 2.3.3 Funcionamiento de un AFN Dada una cadena x, se puede considerar el estado del AFN (macroestado) como el conjunto de estados a los que se puede llegar partiendo del estado inicial y realizando transiciones siguiendo la cadena x Una cadena es reconocida por el AFN si su macroestado contiene algún estado final Ejemplo: Binarios cuyo tercer último dígito es un 0 Cadena 01001 Macroestado: { A, C, D } 24

2.3 Autómatas Finitos No Deterministas 2.3.3 Funcionamiento de un AFN Dado un conjunto de estados E, se denomina clausura-l(e) al conjunto de estados formado por todos los estados de E más aquellos estados a los que se pueda acceder desde E mediante transiciones l. El macroestado inicial del AFN es clausura-l (q 0 ). Partiendo de un macroestado E i, el resultado de una transición con el símbolo a es un macroestado E i+1 = clausura-l(e ), donde E está formado por todos aquellos estados que se puedan alcanzar con transiciones con el símbolo a a partir de alguno de los estados de E i. 25

2.3 Autómatas Finitos No Deterministas 2.3.4 Creación de un AFN a partir de una gramática regular Cada símbolo no terminal genera un estado El símbolo inicial genera el estado inicial Se añade un estado final <F> Cada producción de tipo <A> a <B> genera una transición del estado <A> al <B> con el símbolo a Cada producción del tipo <A> a genera una transición del estado <A> al estado final <F> con el símbolo a 26

2.3 Autómatas Finitos No Deterministas 2.3.4 Creación de un AFN a partir de una gramática Ejemplo: números enteros regular AFN <S> 0 <S> <S> 5 <S> <S> 0 <S> 5 <S> 1 <S> <S> 6 <S> <S> 1 <S> 6 <S> 2 <S> <S> 7 <S> <S> 2 <S> 7 <S> 3 <S> <S> 8 <S> <S> 3 <S> 8 <S> 4 <S> <S> 9 <S> <S> 4 <S> 9 [ 0-9 ] [ 0-9 ] S F 27

2.3 Autómatas Finitos No Deterministas 2.3.5 Creación de un AFN a partir de una expresión regular Expresión regular l: i l f Expresión regular a: i a f Expresión regular rs: i r s f 28

2.3 Autómatas Finitos No Deterministas 2.3.5 Creación de un AFN a partir de una expresión regular Expresión regular r s: i l l r s l l f Expresión regular r*: l i l r l f l 29

2.3 Autómatas Finitos No Deterministas 2.3.5 Creación de un AFN a partir de una expresión regular Propiedades El AFN tiene como máximo el doble de estados que el número de símbolos y operadores de la expresión regular El AFN tiene un estado inicial y un estado final Cada estado tiene tan sólo una transición con un símbolo del alfabeto, o dos transiciones l. 30

Índice 2.1 Introducción 2.2 Especificación de categorías léxicas 2.3 Autómatas Finitos No Deterministas 2.4 Autómatas Finitos Deterministas 2.5 Implementación de un analizador léxico 31

2.4 Autómatas Finitos Deterministas Quintupla: (Q, S, E, q 0, F) 2.4.1 Definición de AFD Q: Conjunto finito de estados S: Alfabeto de símbolos E: Conjunto de arcos (Q S Q) que representan transiciones entre estados ante un determinado símbolo q 0 : Estado inicial (q 0 Q) F: Conjunto de estados finales (F Q) No se admiten transiciones l Condición de determinismo: no existen transiciones que partan del mismo estado con el mismo símbolo 32

2.4 Autómatas Finitos Deterministas 2.4.1 Definición de AFD Ejemplo: 0 1 0 A B Ejemplo: 1 p r o t e c t e d A B C D E F G H I J Ejemplo: A / B * ~[ * ] C * * D / E ~[ *, / ] 33

2.4 Autómatas Finitos Deterministas 2.4.2 Funcionamiento de un AFD Camino: lista de estados en la que a partir de cada estado se puede llegar al siguiente por medio de una transición del autómata. Cadena aceptada x: si existe un camino que parta de q 0, acepte la entrada x y termine en un estado final. Lenguaje reconocido por el autómata: conjunto de cadenas aceptadas En un AFD sólo existe un camino posible, es decir, dada una cadena, sólo es posible llegar a un estado a partir del estado inicial. 34

2.4 Autómatas Finitos Deterministas 2.4.3 Creación de un AFD a partir de un AFN Los AFD tienen la misma capacidad expresiva que los AFN, es decir, dado un AFN existe un AFD capaz de reconocer el mismo lenguaje Cada macroestado del AFN corresponde a un estado del AFD Potencialmente, para un AFN de N estados existen 2 N macroestados posibles, aunque la inmensa mayoría son estados inalcanzables 35

2.4 Autómatas Finitos Deterministas 2.4.3 Creación de un AFD a partir de un AFN Algoritmo para construir un AFD a partir de un AFN: Generar el estado inicial del AFD como el macroestado inicial del AFN e incluirlo en una lista de estados por analizar Analizar el primer estado de la lista por analizar: Extraer el primer estado de la lista e introducirlo en la lista de estados analizados Estudiar las transiciones del estado para cada símbolo del alfabeto Si el macroestado correspondiente a una transición no ha aparecido con anterioridad, crear un nuevo estado del AFD correspondiente a dicho macroestado e incluirlo en la lista de estados por analizar Repetir el paso anterior hasta que no queden estados por analizar Los estados finales del AFD son aquellos que correspondan a macroestados que contengan algún estado final del AFN 36

2.4 Autómatas Finitos Deterministas 2.4.3 Creación de un AFD a partir de un AFN Ejemplo: (a b)* abb l l 0 1 l l a 2 3 b 4 5 l l l a 6 7 8 9 10 b b l 37

2.4 Autómatas Finitos Deterministas 2.4.3 Creación de un AFD a partir de un AFN l l 0 1 a 2 3 l l l a b b 6 7 8 9 10 l b l 4 5 Estado inicial: A = { 0, 1, 2, 4, 7 } Transición de A con a : B = { 1, 2, 3, 4, 6, 7, 8 } Transición de A con b : C = { 1, 2, 4, 5, 6, 7 } Transición de B con a : B Transición de B con b : D = { 1, 2, 4, 5, 6, 7, 9 } Transición de C con a : B Transición de C con b : C Transición de D con a : B Transición de D con b : E = { 1, 2, 4, 5, 6, 7, 10 } (final) Transición de E con a : B Transición de E con b : C l 38

2.4 Autómatas Finitos Deterministas 2.4.3 Creación de un AFD a partir de un AFN Resultado b A b a a C a B b a D b b E a 39

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión regular 1ª opción: Generar un AFN a partir de la expresión regular Generar el AFD a partir del AFN 2ª opción: Generar el AFD directamente a partir de la expresión regular 40

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión regular Características del algoritmo: Se introduce un punto en la expresión regular para indicar la parte reconocida en cada momento Un estado del autómata está asociado a un conjunto de expresiones regulares con puntos El estado inicial se obtiene colocando el punto al comienzo de la expresión regular Las transiciones de cada estado corresponden al consumo de algún símbolo, y dan lugar al desplazamiento del punto en la expresión regular 41

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión regular Ejemplo: [a-z][0-9] Estados: {.[a-z][0-9]}, {[a-z].[0-9]}, {[a-z][0-9].} Autómata: [a-z] [0-9].[a-z][0-9] [a-z].[0-9] [a-z][0-9]. 42

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión regular Ejemplo: ([a-z])*[0-9] Estados: { (.[a-z])*[0-9], ([a-z])*.[0-9] }, { ([a-z])*[0-9].} Autómata: [a-z] [0-9] (.[a-z])*[0-9], ([a-z])*.[0-9] ([a-z])*[0-9]. 43

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión regular Ejemplo: t (a alo re) n Estados: {.t(a alo re)n }, { t(.a alo re)n, t(a.alo re)n, t(a alo.re)n }, { t(a alo re).n, t(a a.lo re)n}, { t(a alo r.e)n }, { t(a alo re)n. }, { t(a al.o re)n }, { t(a alo re).n } 44

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión regular Ejemplo: t (a alo re) n Autómata:.t(a alo re)n t r t(a alo r.e)n n e t(.a alo re)n t(a.alo re)n t(a alo.re)n n t(a alo re)n. o t(a alo re).n a l t(a alo re).n t(a a.lo re)n t(a al.o re)n 45

2.4 Autómatas Finitos Deterministas 2.4.4 Creación de un AFD a partir de una expresión Formalización: regular Ítem no básico a.lg a.(b)g a.(b)*g a(b.)*g a.(b 1 b 2...)g a(... b....)g Ítems básicos al.g a(.b)g a(.b)*g a(b)*.g a(.b)*g a(b)*.g a(.b 1 b 2...)g a(b 1.b 2...)g... a(... b...).g 46

2.4 Autómatas Finitos Deterministas 2.4.5 Minimización de estados de un AFD Algoritmo: (Paso1) Crear una partición con dos grupos: los estados finales y los no finales (Paso 2) Para cada grupo con varios estados, dividir el grupo en subgrupos tales que dos estados, s y t, estén en el mismo subgrupo si y solo si para cada símbolo a, si existe la transición desde s con el símbolo a hacia un estado de un cierto grupo, entonces debe existir la transición desde t con el símbolo a hacia un estado del mismo grupo. (Paso 3) Repetir el paso 2 hasta que no se dividan más grupos (Paso 4) Cada grupo representa un estado en el AFD minimizado (Paso 5) Eliminar los estados no alcanzables desde el estado inicial y los que no tengan transiciones que puedan conducir a un estado final 47

2.4 Autómatas Finitos Deterministas 2.4.5 Minimización de estados de un AFD Ejemplo b A b a a C a B b a D b b E a a b A B C B B D C B C D B E E B C a b a b A E1 E1 A E1 E1 E1 B E1 E1 E1 B E1 E2 C E1 E1 C E1 E1 D E1 F E2 D E1 F F E E1 E1 F E E1 E1 48

2.4 Autómatas Finitos Deterministas 2.4.5 Minimización de estados de un AFD Ejemplo b a E1 a E2 b a b E3 b F a a b A B C B B D C B C D B E E B C E1 a b A E2 E1 C E2 E1 E2 B E2 E3 E3 D E2 F F E E2 E1 No existen estados no alcanzables No existen estados que no conduzcan a un estado final 49

2.4 Autómatas Finitos Deterministas 2.4.6 Comparación AFD vs AFN Tienen la misma capacidad descriptiva Número de estados (memoria ocupada): en un AFN crece linealmente con el tamaño de la expresión. Una expresión de tamaño r puede ser reconocida por un AFN de 2 r estados en un AFD crece exponencialmente con el tamaño de la expresión. En el peor caso, una expresión de tamaño r puede necesitar un AFD con 2 r estados El tiempo de análisis: en un AFD es de orden O(n) en un AFN es de orden O(n*r) n (tamaño de la cadena), r (tamaño de la expresión) 50

Índice 2.1 Introducción 2.2 Especificación de categorías léxicas 2.3 Autómatas Finitos No Deterministas 2.4 Autómatas Finitos Deterministas 2.5 Implementación de un analizador léxico 51

2.5 Implementación de un analizador léxico 2.5.1 Características Objetivo: Dividir el flujo de entrada en componentes léxicos Características: Cada categoría léxica tiene asociada su expresión regular y un conjunto de acciones (emitir u omitir, calcular un valor,...) Estrategia avariciosa: intentar reconocer la cadena más larga posible antes de cambiar de categoría léxica. Utilizaremos máquinas discriminadoras deterministas (MDD) para implementarlos 52

2.5 Implementación de un analizador léxico 2.5.2 Máquina discriminadora determinista Funcionamiento: Muy similar al autómata finito determinista Tienen asociadas acciones a los estados finales Creación de una MDD Paso 1: Añadir un símbolo especial a cada expresión regular Paso 2: Unir todas las expresiones en una Paso 3: Construir el AFD de la expresión Paso 4: Eliminar los estados finales y los arcos de símbolos especiales Paso 5: Convertir en estados finales los estados origen de los arcos de símbolos especiales Paso 6: Asociar a estos estados las acciones correspondientes 53

2.5 Implementación de un analizador léxico Ejemplo (Paso 1): 2.5.2 Máquina discriminadora determinista categoría entero real identificador asignación rango blanco eof Expresión regular [0-9][0-9]*# entero [0-9][0-9]*\.[0-9][0-9]*# real [a-za-z][a-za-z0-9]*# identificador :=# asignación \.\.# rango [ \t\n][ \t\n]*# blanco eof# eof 54

2.5 Implementación de un analizador léxico Ejemplo (Paso 2): 2.5.2 Máquina discriminadora determinista Expresión regular [0-9][0-9]*# entero [0-9][0-9]*\.[0-9][0-9]*# real [a-za-z][a-za-z0-9]*# identificador :=# asignación \.\.# rango [ \t\n][ \t\n]*# blanco eof# eof 55

2.5 Implementación de un analizador léxico Ejemplo (Paso 3): 2.5.2 Máquina discriminadora determinista [0-9]. [0-9] 1 2 3 [0-9] [0-9] : = 4 5 # entero # asign # real 0.. 6 7 [a-za-z] 8 [a-za-z] [ \t\n] [ \t\n] # rango # ident # blanco 11 eof 9 # eof 10 56

2.5 Implementación de un analizador léxico 2.5.2 Máquina discriminadora determinista Ejemplo (Paso 4-6): [0-9]. [0-9] 1 2 3 [0-9] emitir real [0-9] : = 4 5 emitir entero emitir asignación 0.. 6 7 [a-za-z] [a-za-z] emitir rango 8 [ \t\n] [ \t\n] emitir identificador eof 9 omitir 10 emitir eof 57

2.5 Implementación de un analizador léxico 2.5.2 Máquina discriminadora determinista Funcionamiento: Inicialmente la máquina se encuentra en el estado 0. Evoluciona como un AFD hasta encontrar un carácter no reconocido (estrategia avariciosa). Retrocede hasta el último estado final encontrado. Ejecuta las acciones asociadas al estado final. Vuelve al estado inicial. 58

2.5 Implementación de un analizador léxico 2.5.3 Tratamiento de errores Detección: Cuando no se ha alcanzado ningún estado final siguiendo el comportamiento anterior. Tratamiento: Generar un error léxico. Devolver los caracteres leídos. Eliminar el primer carácter. Continuar el análisis. 59

2.5 Implementación de un analizador léxico 2.5.3 Tratamiento de errores Tratamiento alternativo: Crear expresiones regulares que describan errores léxicos Ejemplo: ErrorNúmeroReal: \.[0-9]+ ErrorRango: \. Permite dar mucha más información con el error 60

2.5 Implementación de un analizador léxico 2.5.3 Tratamiento de errores Herramientas automáticas: Suelen abortar al detectar errores léxicos Solución: Añadir categorías léxicas que detecten los errores Emitir tokens de error léxico 61

2.5 Implementación de un analizador léxico 2.5.3 Tratamiento de errores Errores en las acciones asociadas : Suelen corresponder a lexemas con valores no permitidos (números fuera de rango, por ejemplo) Solución no recomendada: Utilizar expresiones regulares que lo eviten Ejemplo: literales tipo byte (0-255) [0-9](b B) [0-9][0-9](b B) [01][0-9][0-9](b B) 2[0-4][0-9](b B) 25[0-5](b B) 62

2.5 Implementación de un analizador léxico 2.5.3 Tratamiento de errores Errores en las acciones asociadas : Solución recomendada: Detectarlos antes de emitir el token Emitir tokens de error léxico Tratamiento en las herramientas automáticas: El análisis léxico sólo devuelve lexemas. Los lexemas se evalúan a nivel sintáctico o semántico 63

2.5 Implementación de un analizador léxico 2.5.4 Tratamiento de palabras reservadas Problema: Se confunden con identificadores Solución (muy poco recomendable): Modificar la expresión regular del identificador para evitarlo Generar el AFD de la forma habitual 64

2.5 Implementación de un analizador léxico 2.5.4 Tratamiento de palabras reservadas Ejemplo: (identificador y class) NO RECOMENDABLE 3 a 4 s 5 s 6 emitir class [a-rt-za-z] [a-rt-za-z] l 2 [b-za-z] [a-za-z] emitir identificador emitir identificador c [a-km-za-z] emitir identificador emitir identificador 0 1 [abd-za-z] [a-za-z] emitir identificador 65

2.5 Implementación de un analizador léxico 2.5.4 Tratamiento de palabras reservadas Solución: Tratar las palabras reservadas como identificadores Almacenar todas las palabras reservadas en una tabla Antes de emitir el identificador, buscar en la tabla Si aparece en la tabla, emitir el token de la palabra reservada Si no aparece en la tabla, emitir el token de identificador 0 1 [a-za-z] [a-za-z] - buscar lexema - emitir identificador o - emitir palabra clave 66

2.5 Implementación de un analizador léxico Solución alternativa: 2.5.4 Tratamiento de palabras reservadas Utilizar Máquinas Discriminadoras No Deterministas 67

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Funcionamiento: Similar a las MDD Basadas en Autómatas Finitos No Deterministas Creación: Paso 1: Ordenar las diferentes expresiones regulares Paso 2: Unir todas las expresiones regulares Paso 3: Generar el Autómata Finito No Determinista Paso 4: Añadir las acciones a los estados finales 68

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Ejemplo (Paso 1): categoría class int long double identificador blanco eof Expresión regular class int long double [a-za-z][a-za-z0-9]* [ \t\n][ \t\n]* eof 69

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Ejemplo (Paso 2): Expresión regular class int long double [a-za-z][a-za-z0-9]* [ \t\n][ \t\n]* eof 70

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Ejemplo (Paso 3): 0 c i l d l a s 1 2 3 4 n 6 7 8 o n 9 10 11 13 o t g 12 u b l 14 15 16 17 s 5 e 18 eof [a-za-z] 19 [a-za-z] [ \t\n] [ \t\n] 21 20 71

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Ejemplo (Paso 4): 0 c i l d l a s 1 2 3 4 n 6 7 t 8 o n 9 10 11 13 o g 12 u b l 14 15 16 17 s 5 e 18 emitir class emitir integer emitir long emitir double eof [a-za-z] 19 [a-za-z] [ \t\n] [ \t\n] emitir identificador 21 20 omitir emitir EOF 72

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Funcionamiento: Inicialmente la máquina se encuentra en el estado 0. Evoluciona como un AFN hasta encontrar un carácter no reconocido (estrategia avariciosa). Retrocede hasta la última transición que contuviera al menos un estado final. Si encuentra varios estados finales, selecciona el primero en el orden establecido en el paso 1. Ejecuta las acciones asociadas al estado final seleccionado. Vuelve al estado inicial. 73

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista La mayoría de herramientas automáticas se basan en máquinas discriminadoras no deterministas Utilizan el orden de declaración de las expresiones regulares para resolver los conflictos entre estados finales Las palabras reservadas se declaran antes del token identificador (lo que resuelve el conflicto entre palabras reservadas e identificadores) Se suele introducir una última expresión regular que acepta cualquier carácter y que identifica al token de error léxico (de esta manera se evita que se aborte al encontrar un error léxico) Sólo utiliza las acciones emitir token y omitir (skip). 74

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Ejemplo: JavaCC SKIP : { " " "\r" "\n" "\t" <SINGLE_LINE_COMMENT: "//" (~["\n","\r"])* ("\n" "\r" "\r\n")> <MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" (~["*","/"] (~["*"])* "*"))* "/"> } 75

2.5 Implementación de un analizador léxico 2.5.5 Máquina discriminadora no determinista Ejemplo: JavaCC TOKEN : /* palabras clave */ { <CLASS: "class"> <INTEGER: "int"> <LONG: "long"> <DOUBLE: "double"> } TOKEN: /* identificador */ { <ID : ["a"-"z","a"-"z","_"] (["a"-"z","a"-"z","0"-"9","_"])* > } 76