Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROCESADORES DE LENGUAJES
TEMA II: ANÁLISIS LÉXICO
Programa
Programa
1 Introducción
Programa
1 Introducción
Programa
1 Introducción
Programa
1 Introducción
Programa
1 Introducción
1 Introducción
Contenido de la sección
1 Introducción
El análisis léxico en el proceso de traducción
Componentes Léxicos
Tabla de Sı́mbolos
Palabras claves
Ejemplo
Autonomı́a del analizador léxico
Introducción
El análisis léxico en el proceso de traducción
Análisis Léxico
Primera fase del proceso de traducción
Lee el código fuente “carácter a carácter”
Genera los componentes léxicos
Procedimiento auxiliar del Análisis Sintáctico
Crea la Tabla de Sı́mbolos
El Gestor de errores procesa los errores léxicos detectados
Introducción
El análisis léxico en el proceso de traducción
Análisis Léxico
Primera fase del proceso de traducción
Lee el código fuente “carácter a carácter”
Genera los componentes léxicos
Procedimiento auxiliar del Análisis Sintáctico
Crea la Tabla de Sı́mbolos
El Gestor de errores procesa los errores léxicos detectados
Introducción
El análisis léxico en el proceso de traducción
Análisis Léxico
Primera fase del proceso de traducción
Lee el código fuente “carácter a carácter”
Genera los componentes léxicos
Procedimiento auxiliar del Análisis Sintáctico
Crea la Tabla de Sı́mbolos
El Gestor de errores procesa los errores léxicos detectados
Introducción
El análisis léxico en el proceso de traducción
Análisis Léxico
Primera fase del proceso de traducción
Lee el código fuente “carácter a carácter”
Genera los componentes léxicos
Procedimiento auxiliar del Análisis Sintáctico
Crea la Tabla de Sı́mbolos
El Gestor de errores procesa los errores léxicos detectados
Introducción
El análisis léxico en el proceso de traducción
Análisis Léxico
Primera fase del proceso de traducción
Lee el código fuente “carácter a carácter”
Genera los componentes léxicos
Procedimiento auxiliar del Análisis Sintáctico
Crea la Tabla de Sı́mbolos
El Gestor de errores procesa los errores léxicos detectados
Introducción
El análisis léxico en el proceso de traducción
Análisis Léxico
Primera fase del proceso de traducción
Lee el código fuente “carácter a carácter”
Genera los componentes léxicos
Procedimiento auxiliar del Análisis Sintáctico
Crea la Tabla de Sı́mbolos
El Gestor de errores procesa los errores léxicos detectados
Introducción
El análisis léxico en el proceso de traducción
Código Fuente
Analizador Léxico
Introducción
El análisis léxico en el proceso de traducción
Código Fuente
Tabla de Sı́mbolos
Analizador Léxico
Introducción
El análisis léxico en el proceso de traducción
Código Fuente
Analizador Léxico
Introducción
El análisis léxico en el proceso de traducción
Código Fuente
Analizador Léxico
Componentes Léxicos
Contenido de la sección
1 Introducción
El análisis léxico en el proceso de traducción
Componentes Léxicos
Tabla de Sı́mbolos
Palabras claves
Ejemplo
Autonomı́a del analizador léxico
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Ejemplo
Identificadores: variables, palabras claves, ...
Números
Cadenas de caracteres
Operadores: aritméticos, relacionales, lógicos, ...
Signos de puntuación
Etc.
Introducción
Componentes Léxicos
Introducción
Componentes Léxicos
Introducción
Componentes Léxicos
Contenido de la sección
1 Introducción
El análisis léxico en el proceso de traducción
Componentes Léxicos
Tabla de Sı́mbolos
Palabras claves
Ejemplo
Autonomı́a del analizador léxico
Introducción
Tabla de Sı́mbolos
Tabla de Sı́mbolos
Se crea durante el Análisis Léxico
Puede almacenar:
+ Números
+ Cadenas
+ ...
+ Pero, sobre todo, identificadores
Introducción
Tabla de Sı́mbolos
Tabla de Sı́mbolos
Cuando el analizador léxico reconoce un identificador:
+ Se inserta el identificador en la Tabla de Sı́mbolos
+ Devuelve el componente léxico de identificador y un puntero o
ı́ndice a su posición en la Tabla de Sı́mbolos
La información del identificador depende de su naturaleza:
+ Variable: tipo de dato, valor, ...
+ Función: número y tipo de argumentos, ...
+ Etc.
Introducción
Tabla de Sı́mbolos
Tabla de Sı́mbolos
Cuando el analizador léxico reconoce un identificador:
+ Se inserta el identificador en la Tabla de Sı́mbolos
+ Devuelve el componente léxico de identificador y un puntero o
ı́ndice a su posición en la Tabla de Sı́mbolos
La información del identificador depende de su naturaleza:
+ Variable: tipo de dato, valor, ...
+ Función: número y tipo de argumentos, ...
+ Etc.
Introducción
Tabla de Sı́mbolos
Introducción
Tabla de Sı́mbolos
Nota
La información de los identificadores se completa durante todas las
fases del proceso de traducción
Contenido de la sección
1 Introducción
El análisis léxico en el proceso de traducción
Componentes Léxicos
Tabla de Sı́mbolos
Palabras claves
Ejemplo
Autonomı́a del analizador léxico
Introducción
Palabras claves
Ejemplo (PL/I)
IF (IF > 1) THEN THEN = 0;
Introducción
Palabras claves
Ejemplo (PL/I)
IF (IF > 1) THEN THEN = 0;
Introducción
Palabras claves
Ejemplo (PL/I)
IF (IF > 1) THEN THEN = 0;
Introducción
Palabras claves
Palabras claves
Tipos de reconocimiento de las palabras claves:
1.- Implı́cito: preinstalación en la Tabla de Sı́mbolos
2.- Explı́cito: reconocimiento especı́fico de cada palabra clave.
Introducción
Palabras claves
Palabras claves
Tipos de reconocimiento de las palabras claves:
1.- Implı́cito: preinstalación en la Tabla de Sı́mbolos
2.- Explı́cito: reconocimiento especı́fico de cada palabra clave.
Introducción
Palabras claves
Palabras claves
Tipos de reconocimiento de las palabras claves:
1.- Implı́cito: preinstalación en la Tabla de Sı́mbolos
2.- Explı́cito: reconocimiento especı́fico de cada palabra clave.
Introducción
Palabras claves
Palabras claves
1.- Preinstalación en la Tabla de Sı́mbolos:
+ Se almacena el nombre y el componente léxico
+ Al reconocer un identificador, se consulta la Tabla de Sı́mbolos
para comprobar si es una palabra clave o no.
+ Ventajas
- La programación del analizador léxico es más sencilla
+ Inconvenientes
- El reconocimiento es más lento
- Se necesita más memoria para la Tabla de Sı́mbolos
Introducción
Palabras claves
Palabras claves
1.- Preinstalación en la Tabla de Sı́mbolos:
+ Se almacena el nombre y el componente léxico
+ Al reconocer un identificador, se consulta la Tabla de Sı́mbolos
para comprobar si es una palabra clave o no.
+ Ventajas
- La programación del analizador léxico es más sencilla
+ Inconvenientes
- El reconocimiento es más lento
- Se necesita más memoria para la Tabla de Sı́mbolos
Introducción
Palabras claves
Palabras claves
1.- Preinstalación en la Tabla de Sı́mbolos:
+ Se almacena el nombre y el componente léxico
Ejemplo
Nombre Componente Léxico ... ...
if IF
while WHILE
...
Introducción
Palabras claves
Palabras claves
1.- Preinstalación en la Tabla de Sı́mbolos:
+ Se almacena el nombre y el componente léxico
+ Al reconocer un identificador, se consulta la Tabla de Sı́mbolos
para comprobar si es una palabra clave o no.
+ Ventajas
- La programación del analizador léxico es más sencilla
+ Inconvenientes
- El reconocimiento es más lento
- Se necesita más memoria para la Tabla de Sı́mbolos
Introducción
Palabras claves
Palabras claves
1.- Preinstalación en la Tabla de Sı́mbolos:
+ Se almacena el nombre y el componente léxico
+ Al reconocer un identificador, se consulta la Tabla de Sı́mbolos
para comprobar si es una palabra clave o no.
+ Ventajas
- La programación del analizador léxico es más sencilla
+ Inconvenientes
- El reconocimiento es más lento
- Se necesita más memoria para la Tabla de Sı́mbolos
Introducción
Palabras claves
Palabras claves
1.- Preinstalación en la Tabla de Sı́mbolos:
+ Se almacena el nombre y el componente léxico
+ Al reconocer un identificador, se consulta la Tabla de Sı́mbolos
para comprobar si es una palabra clave o no.
+ Ventajas
- La programación del analizador léxico es más sencilla
+ Inconvenientes
- El reconocimiento es más lento
- Se necesita más memoria para la Tabla de Sı́mbolos
Introducción
Palabras claves
Palabras claves
2.- Reconocimiento especı́fico de cada palabra clave.
+ Cada palabra clave es reconocida de forma independiente de
los demás identificadores y palabras claves
+ Ventajas
- El reconocimiento es más rápido
- No se necesita aumentar la memoria de la Tabla de Sı́mbolos:
las palabras claves no se almacenan
+ Inconvenientes
- La programación del analizador léxico es más compleja
Introducción
Palabras claves
Palabras claves
2.- Reconocimiento especı́fico de cada palabra clave.
+ Cada palabra clave es reconocida de forma independiente de
los demás identificadores y palabras claves
+ Ventajas
- El reconocimiento es más rápido
- No se necesita aumentar la memoria de la Tabla de Sı́mbolos:
las palabras claves no se almacenan
+ Inconvenientes
- La programación del analizador léxico es más compleja
Introducción
Palabras claves
Palabras claves
2.- Reconocimiento especı́fico de cada palabra clave.
+ Cada palabra clave es reconocida de forma independiente de
los demás identificadores y palabras claves
+ Ventajas
- El reconocimiento es más rápido
- No se necesita aumentar la memoria de la Tabla de Sı́mbolos:
las palabras claves no se almacenan
+ Inconvenientes
- La programación del analizador léxico es más compleja
Contenido de la sección
1 Introducción
El análisis léxico en el proceso de traducción
Componentes Léxicos
Tabla de Sı́mbolos
Palabras claves
Ejemplo
Autonomı́a del analizador léxico
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
dividendo
+ Es reconocido como IDENTIFICADOR
+ Se devuelve el componente léxico y el puntero a la Tabla de
Sı́mbolos
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
Se eliminan
+ Espacios en blanco
+ Tabuladores
+ Saltos de lı́nea
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
Signo =
+ Se devuelve el token de ASIGNACIÓN
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
Nota
El Análisis Sintáctico sólo necesita saber que se ha reconocido
el componente léxico ASIGNACIÓN
No le importa si el sı́mbolo es = o := o cualquier otro
No interesa el texto concreto, sino la categorı́a a la que
pertenece
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
divisor
+ Es reconocido como IDENTIFICADOR
+ Se devuelve el componente léxico y el puntero a la Tabla de
Sı́mbolos
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
Signo *
+ Se devuelve el token de PRODUCTO
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
cociente
+ Es reconocido como IDENTIFICADOR
+ Se devuelve el componente léxico y el puntero a la Tabla de
Sı́mbolos
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
Signo +
+ Se devuelve el token de SUMA
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
resto
+ Es reconocido como IDENTIFICADOR
+ Se devuelve el componente léxico y el puntero a la Tabla de
Sı́mbolos
Introducción
Ejemplo
Ejemplo
Sentencia del lenguaje C
dividendo = divisor * cociente + resto ;
Signo ;
+ Se devuelve el token de FIN DE SENTENCIA
Contenido de la sección
1 Introducción
El análisis léxico en el proceso de traducción
Componentes Léxicos
Tabla de Sı́mbolos
Palabras claves
Ejemplo
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
Introducción
Autonomı́a del analizador léxico
1 Introducción
Contenido de la sección
1 Introducción
Componentes léxicos
Elementos básicos de los lenguajes de programación
Se describen mediante
+ Una descripción informal
+ Una descripción formal mediante expresiones regulares
+ Ejemplos o paradigmas
Componentes léxicos
Elementos básicos de los lenguajes de programación
Se describen mediante
+ Una descripción informal
+ Una descripción formal mediante expresiones regulares
+ Ejemplos o paradigmas
Componentes léxicos
Elementos básicos de los lenguajes de programación
Se describen mediante
+ Una descripción informal
+ Una descripción formal mediante expresiones regulares
+ Ejemplos o paradigmas
Componentes léxicos
Elementos básicos de los lenguajes de programación
Se describen mediante
+ Una descripción informal
+ Una descripción formal mediante expresiones regulares
+ Ejemplos o paradigmas
Componentes léxicos
Elementos básicos de los lenguajes de programación
Se describen mediante
+ Una descripción informal
+ Una descripción formal mediante expresiones regulares
+ Ejemplos o paradigmas
Nota
Sólo interesa saber el significado (Componente Léxico) que se
asocia a uno o más signos, no cómo son dichos signos.
Nota
Sólo interesa saber el significado (Componente Léxico) que se
asocia a uno o más signos, no cómo son dichos signos.
Contenido de la sección
1 Introducción
Ejemplo
Σ1 = {0, 1} (Alfabeto binario)
Σ2 = {0, 1, 2, · · · , 9}
Σ3 = {a, b, c, · · · , z}
Σ4 = {if , else}
Σ5 = {ab, ca, bbc}
Nota
La longitud de una palabra depende del alfabeto sobre el que
esté definida.
Nota
La longitud de una palabra depende del alfabeto sobre el que
esté definida.
Nota
L = {} =
6 L∅ = ∅
∈ Σ+ ⇐⇒ ∈ Σ
Nota
L puede ser denotado por la expresión regular ab ∗
L1 ∪ L2 = {x|x ∈ L1 ∨ x ∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 ∪ L2 = {ab, bc, bcc, a, abb, ac}
Nota
No hay palabras o cadenas repetidas
L1 ∪ L2 = {x|x ∈ L1 ∨ x ∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 ∪ L2 = {ab, bc, bcc, a, abb, ac}
Nota
No hay palabras o cadenas repetidas
L1 ∪ L2 = {x|x ∈ L1 ∨ x ∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 ∪ L2 = {ab, bc, bcc, a, abb, ac}
Nota
No hay palabras o cadenas repetidas
Ejemplo
Si L1 = {ab, a, bb} y L2 = {bc, c, aa}
entonces L1 L2 = {abbc, abc, abaa, ac, aaa, bbbc, bbc, bbaa}
Nota
No hay palabras o cadenas repetidas
Ejemplo
Si L1 = {ab, a, bb} y L2 = {bc, c, aa}
entonces L1 L2 = {abbc, abc, abaa, ac, aaa, bbbc, bbc, bbaa}
Nota
No hay palabras o cadenas repetidas
Ejemplo
Si L1 = {ab, a, bb} y L2 = {bc, c, aa}
entonces L1 L2 = {abbc, abc, abaa, ac, aaa, bbbc, bbc, bbaa}
Nota
No hay palabras o cadenas repetidas
Ejemplo
L0 = {x 0 |x ∈ L} = {}
L1 = L
L2 = LL
···
Li = LLi−1
Ejemplo
L0 = {x 0 |x ∈ L} = {}
L1 = L
L2 = LL
···
Li = LLi−1
Ejemplo
Si L = {a} entonces
∞
[
∗
L = Li
i=0
= L ∪ L1 ∪ L2 ∪ · · ·
0
L3 = L1 L2 = {ab}
L4 = L2 L1 = {ba}
L5 = L3 ∪ L4 = {ab, ba}
∞
[
L6 = L∗5 = Li5 = L05 ∪ L15 ∪ L25 ∪ · · ·
i=0
= {} ∪ {ab, ba} ∪ {abab, abba, baab, baba} · · ·
= {, ab, ba, abab, abba, baab, baba, · · · }
L1 ∩ L2 = {x|x ∈ L1 ∧ x ∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 ∩ L2 = {bc}
Nota
No hay palabras o cadenas repetidas
L1 ∩ L2 = {x|x ∈ L1 ∧ x ∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 ∩ L2 = {bc}
Nota
No hay palabras o cadenas repetidas
L1 ∩ L2 = {x|x ∈ L1 ∧ x ∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 ∩ L2 = {bc}
Nota
No hay palabras o cadenas repetidas
L1 − L2 = {x|x ∈ L1 ∧ x 6∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 − L2 = {ab, bcc}
L1 − L2 = {x|x ∈ L1 ∧ x 6∈ L2 }
Ejemplo
Si L1 = {ab, bc, bcc} y L2 = {a, bc, abb, ac}
entonces L1 − L2 = {ab, bcc}
L = Σ∗ − L = {x|x ∈ Σ∗ ∧ x 6∈ L}
Ejemplo
Si Σ = {a, b}
Si L = {, a, ab, abb, abbb, . . .}
entonces L = {b, aa, ba, bb, aaa, aab, . . .}
Ejemplo
∅ = Σ∗
Σ∗ = ∅
Ejemplo
Si Σ = {a, b}
Si L = {, a, ab, abb, abbb, . . .}
entonces L = {b, aa, ba, bb, aaa, aab, . . .}
Ejemplo
∅ = Σ∗
Σ∗ = ∅
Contenido de la sección
1 Introducción
Notas
La palabra vacı́a se puede representar por o λ
La alternativa se puede representar por + o por |
El punto de la concatenación se suele omitir
Palabras que comienza por cero o por uno y van seguidas por cero
o más unos
Ejemplos
letra = (a + b + c + · · · + z)
cifra = (0 + 1 + · · · + 9)
guion = −
subrayado =
C:
(subrayado + letra) (subrayado + letra + cifra)∗
Cobol:
letra (letra + cifra + guion (letra + cifra))∗
Nota (Abreviaturas)
α? = α + = + α
α+ = α α∗ = α∗ α
Nota (Abreviaturas)
α? = α + = + α
α+ = α α∗ = α∗ α
Nota
Palabras claves: existe una expresión regular para cada palabra
clave.
Nota
El analizador sintáctico sólo necesita saber cuál es el
componente léxico reconocido
Ejemplo
Se verifica que
aa∗ ≡ a∗ a
porque
L(aa∗ ) = L(a)L(a∗ )
= {a}{, a, aa, · · · }
= {a, aa, aaa, · · · }
= {, a, aa, · · · }{a}
= L(a∗ )L(a)
= L(a∗ a)
L(∅∗ ) = (L(∅))
S∞ i
∗ = (∅)∗
= i=0 ∅ = ∅0 ∪ ∅1 ∪ ∅2 · · ·
= {} ∪ ∅ ∪ ∅ · · ·
= {} = L()
12.- α∗ α∗ = α∗
13.- α α∗ = α∗ α = α+
14.- (α∗ )∗ = α∗
15.- α∗ = + α α∗
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 204 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
Ejemplo
L1 = {ai b j |i, j ≥ 0}
= {, a, aa, aaa, · · · b, ab, aab, · · · }
= {, a, aa, aaa, · · · }{, b, bb, bbb}
= L(a∗ b ∗ )
Ejemplo
L1 = {ai b j |i, j ≥ 0}
= {, a, aa, aaa, · · · b, ab, aab, · · · }
= {, a, aa, aaa, · · · }{, b, bb, bbb}
= L(a∗ b ∗ )
Ejemplo
Lenguaje que no puede ser denotado por una expresión regular
Ejemplo
L2 = {ai b i |i ≥ 0} representa a muchas estructuras sintácticas
de los lenguajes de programación:
+ Balanceo de paréntesis, llaves o corchetes.
+ Paso de parámetros
+ Etc.
1 Introducción
Contenido de la sección
1 Introducción
COMPONENTES LÉXICOS
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
AFD
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
AFD
ANALIZADOR LÉXICO
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
LEX
AFD
ANALIZADOR LÉXICO
Contenido de la sección
1 Introducción
Descripción general
Definición formal
Función de transición para palabras
Representación gráfica
Lenguaje reconocido por un AFD
Descripción general
Definición formal
Función de transición para palabras
Representación gráfica
Lenguaje reconocido por un AFD
Componentes de un AFD
Cinta de lectura:
+ Dividida en celdas.
+ Infinita hacia la derecha.
Cabeza de lectura:
+ Lee el sı́mbolo actual de la cinta.
+ Sólo se puede mover hacia la derecha.
Alfabeto de la cinta
Unidad de control de estados: indica el estado actual.
Sentido de recorrido
σ ... Cinta
Cabeza de lectura
q
i
q
0
Configuración inicial
q’
q
f
Configuración final
Descripción general
Definición formal
Función de transición para palabras
Representación gráfica
Lenguaje reconocido por un AFD
q0 ∈ Q: estado inicial
F ⊆ Q: conjunto de estados finales
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 237 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
δ l d g
→ q0 q1 q3 q3
← q1 q1 q1 q2
q2 q1 q1 q3
q3 q3 q3 q3
Descripción general
Definición formal
Función de transición para palabras
Representación gráfica
Lenguaje reconocido por un AFD
δ̂(q, ) = q∈Q
δ̂(q, xσ) = δ(δ̂(q, x), σ) ∈ Q ∀x ∈ Σ∗ ∧ σ ∈ Σ
Notas
δ̂ y δ coinciden sobre sı́mbolos de Σ:
Ejemplo
Nota
x = llgd es reconocida por el AFD porque q1 es un estado final.
Nota
Existe una notación más simple para el reconocimiento de un
AFD.
Ejemplo
Nota
Existe una notación más simple para el reconocimiento de un
AFD.
Ejemplo
Nota
Existe una notación más simple para el reconocimiento de un
AFD.
Ejemplo
Descripción general
Definición formal
Representación gráfica
Lenguaje reconocido por un AFD
d, g
q g
3
l, d, g
Descripción general
Definición formal
Representación gráfica
Lenguaje reconocido por un AFD
Notas
Si F = Q entonces L(A) = Σ∗
Si F = ∅ entonces L(A) = ∅
q0 ∈ F si y sólo si ∈ L(A)
Ejemplo
L(A) = L(l(l + d + g (l + d))∗ )
a b a, b
a···a b b···b
L(A) = L(a∗ b ∗ )
Nota
El estado q2 es inútil o superfluo
Nota
El estado q2 es superfluo
dígito
" " q
q q
0 1 2
σ \ σ
σ
q q
3 b
Contenido de la sección
1 Introducción
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Nota
Las transiciones triviales siempre existen y se suponen tácitamente
por defecto.
Nota
Si existen, estas transiciones se han de indicar expresamente.
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 270 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
Nota
Las transiciones triviales siempre existen y se suponen tácitamente
por defecto.
Nota
Si existen, estas transiciones se han de indicar expresamente.
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 271 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
Nota
Las transiciones triviales siempre existen y se suponen tácitamente
por defecto.
Nota
Si existen, estas transiciones se han de indicar expresamente.
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 272 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
Nota
Las transiciones triviales siempre existen y se suponen tácitamente
por defecto.
Nota
Si existen, estas transiciones se han de indicar expresamente.
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 273 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
Ejemplo
δ a b
→ q0 {q1 } ∅ {q0 , q1 }
q1 ∅ {q3 , q4 } {q1 , q2 }
q2 ∅ {q5 } {q2 }
q3 {q2 } ∅ {q3 }
q4 {q4 , q5 } ∅ {q2 , q4 }
← q5 ∅ {q5 } {q3 , q5 }
Nota
Un AFD puede considerarse un caso especial de AFN:
No existen transiciones- no triviales.
y no existen transiciones múltiples, es decir,
δ(q, σ) = {q 0 }
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Ejemplo
ε
q
3
ε b ε
ε a
ε
a, ε ε b b, ε
q q q q5
0 1 2
ε a
b
q
4
a, ε
Ejemplo
q
3
b ε
a
a, ε ε b b
q q q q5
0 1 2
ε a
b
q
4
a
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Si q ∈ Q
+ q ∈ clausura − (q)
+ Si q 0 ∈ clausura − (q) ∧ q 00 ∈ δ(q 0 , )
entonces q 00 ∈ clausura − (q)
clausura − : Q −→ P(Q)
Nota
Siempre se verifica que q ∈ clausura − (q)
Si P ⊆ Q
+ P ∈ clausura − (P)
+ Si q 0 ∈ clausura − (P) ∧ q 00 ∈ δ(q 0 , )
entonces q 00 ∈ clausura − (P)
!
0
S
= clausura − δ(q , a)
q 0 ∈{q0 ,q1 ,q2 }
!
δ(q 0 , b)
S
= clausura −
q 0 ∈{q1 ,q2 }
= clausura − (δ(q1 , b) ∪ δ(q2 , b))
= clausura − ({q3 , q4 } ∪ {q5 })
= clausura − ({q3 , q4 , q5 })
= {q2 , q3 , q4 , q5 }
!
δ(q 0 , b)
S
= clausura −
q 0 ∈{q2 ,q3 ,q4 ,q5 }
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
Ejemplo (Aplicación de δ̂ a p ⊆ Q)
Sea el AFN anterior y p = {q0 , q3 }:
δ(p, a) = δ({q0 , q3 }, a)
[
= δ(q, σ)
q∈{q0 ,q3 }
= δ(q0 , a) ∪ δ(q3 , a)
= {q1 } ∪ {q2 }
= {q1 , q2 }
Teorema
Dado un AFN AN , se puede construir otro AFD AD equivalente:
L(AN ) = L(AD )
Demostración
AFN
Demostración
AFN
Demostración
AFN
AFD
Demostración
inicio
p0 ← clausura − (q0 ) ; QD ← {p0 } y p0 no marcado
mientras haya un estado p ∈ QD no marcado hacer
Marcar a p
para cada σ ∈ Σ hacer
p 0 ← clausura − (δN (p, σ))
si p 0 ∈
/ QD entonces
QD ← QD ∪ {p 0 } y p 0 no marcado
fin si
Definir δD (p, σ) ← p 0
fin para
fin mientras
FD ← {pi |FN ∩ pi 6= ∅}
fin
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 310 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
p
0
Se marca el estado p0 :
QD = {p 0 }
Como p1 ∈
/ QD :
QD = QD ∪ {p1 } = {p 0 , p1 }
δD (p0 , b) = p2
Como p2 ∈
/ QD :
QD = QD ∪ {p2 } = {p 0 , p1 , p2 }
p
a 1
p
0
b
p
2
Paso 1: transiciones de p0
Se marca el estado p1 :
QD = {p 0 , p 1 , p2 }
δD (p1 , b) = p2
p
a 1
p
0
b
b
p
2
Paso 2: transiciones de p1
Se marca el estado p2 :
QD = {p 0 , p 1 , p 2 }
δD (p2 , a) = p2
δD (p2 , b) = p3
Como p3 ∈
/ QD
QD = {p 0 , p 1 , p 2 , p3 }
p p
0 3
b b
b
p
2
Paso 3: transiciones de p2
Se marca el estado p3 :
QD = {p 0 , p 1 , p 2 , p 3 }
δD (p3 , a) = p4
Como p4 ∈
/ QD
QD = {p 0 , p 1 , p 2 , p 3 , p4 }
δD (p3 , b) = p3
p p a p
0 3 4
b b
b
p b
2
Paso 4: transiciones de p3
Se marca el estado p4
QD = {p 0 , p 1 , p 2 , p 3 , p 4 }
δD (p4 , a) = −
δ(p4 , b) = p3
Nota
El algoritmo finaliza al estar marcados todos los estados de QD .
a
p p p
0 3 4
b b b
b
p b
2
Paso 5: transiciones de p4
x ∈ L(AD ) porque p3 ∈ FD
Descripción general
Definición formal
Representación gráfica
Función de transición para palabras
Lenguaje reconocido por un AFN
Equivalencia entre AFN y AFD
Equivalencia entre expresiones regulares y autómatas finitos
AFN
AFN
AFN
AFD
EXPRESIÓN REGULAR
AFN
AFD
EXPRESIÓN REGULAR
Algoritmo de Thompson
AFN
AFD
Teorema
Dada una expresión regular α, se puede construir un AFN AN
equivalente:
L(α) = L(AN )
Demostración
EXPRESIÓN REGULAR
Demostración
EXPRESIÓN REGULAR
Algoritmo de Thompson
Demostración
EXPRESIÓN REGULAR
Algoritmo de Thompson
AFN
Demostración
Algoritmo (Thompson)
Entrada: expresión regular α.
Salida: AFN AN = (QN , Σ, δN , q0 , FN )
Algoritmo (Thompson)
q qf
0
Algoritmo (Thompson)
ε
q0 qf
Algoritmo (Thompson)
σ
q q
0 f
Algoritmo (Thompson)
q A q
0α α fα
ε
ε
q0 qf
ε
ε
q A q
0β β fβ
Algoritmo (Thompson)
q0 A q ε q0 Aβ q fβ
α α fα β
Algoritmo (Thompson)
ε
q ε q A qf ε
0 0α qf
α α
Algoritmo (Thompson)
Nota
L((α)) = L(α) = L(AN )
l
ε ε
ε d ε
l
ε ε
ε ε
ε d ε
l q
ε q
4 6 ε
q l q ε q
ε q q
ε
q
0 1 2 3 8 9
ε d ε
q q
5 7
EXPRESIÓN REGULAR
EXPRESIÓN REGULAR
Algoritmo de Thompson
EXPRESIÓN REGULAR
Algoritmo de Thompson
AFN
EXPRESIÓN REGULAR
Algoritmo de Thompson
AFN
EXPRESIÓN REGULAR
Algoritmo de Thompson
AFN
AFD
p
0
Se marca el estado p0 :
QD = {p 0 }
Como p1 ∈
/ QD :
QD = QD ∪ {p1 } = {p 0 , p1 }
δD (p0 , d) = −
l
p p
0 1
Paso 1: transiciones de p0
Se marca el estado p1 :
QD = {p 0 , p 1 }
Como p2 ∈
/ QD :
QD = QD ∪ {p2 } = {p 0 , p 1 , p2 }
Como p3 ∈
/ QD :
QD = QD ∪ {p3 } = {p 0 , p 1 , p2 , p3 }
p
l 2
l
p p
0 1
d
p
3
Paso 2: transiciones de p1
Se marca el estado p2 :
QD = {p 0 , p 1 , p 2 , p3 }
δD (p2 , l) = p2
δD (p2 , d) = p3
d
p
3
Paso 3: transiciones de p2
Se marca el estado p3 :
QD = {p 0 , p 1 , p 2 , p 3 }
δD (p3 , l) = p2
δD (p3 , d) = p3
d d
p
3
Paso 4: transiciones de p3
Nota
El algoritmo finaliza al estar marcados todos los estados de QD .
Ejemplo
l l, d
q q
0 1
Contenido de la sección
1 Introducción
Definición
Dos autómatas son equivalentes si reconocen el mismo lenguaje:
A ≡ A0 ⇔ L(A) = L(A0 )
∀x ∈ Σ∗ (δ̂(q, x) ∈ F ⇔ δ̂(q 0 , x) ∈ F )
(δ̂(q, x) ∈ F ⇔ δ̂(q 0 , x) ∈ F )
⇒ (δ̂(q, x) ∈ F ⇔ δ̂(q 00 , x) ∈ F )
(δ̂(q 0 , x) ∈ F ⇔ δ̂(q 00 , x) ∈ F )
|Q|E | ≤ |Q|
Nota
La función δ̂|E se define de manera similar a δ̂.
Teorema
Todo AFD es equivalente a su autómata cociente:
L(A) = L(A|E )
Demostración
x ∈ L(A) ⇔ δ̂(q0 , x) ∈ F
⇔ ∃qf ∈ F δ̂(q0 , x) = qf
⇔ p0 = E [q0 ] ∧ ∃qf ∈ F pf = E [qf ] ∧ δ̂|E (p0 , x) = pf
⇔ δ̂|E (p0 , x) = pf ∈ F|E
⇔ x ∈ L(A|E )
Teorema
Todo AFD es equivalente a su autómata cociente:
L(A) = L(A|E )
Demostración
x ∈ L(A) ⇔ δ̂(q0 , x) ∈ F
⇔ ∃qf ∈ F δ̂(q0 , x) = qf
⇔ p0 = E [q0 ] ∧ ∃qf ∈ F pf = E [qf ] ∧ δ̂|E (p0 , x) = pf
⇔ δ̂|E (p0 , x) = pf ∈ F|E
⇔ x ∈ L(A|E )
Demostración
inicio
p0 ← Q − F , p1 ← F
Nuevo ← {p0 , p1 } y p0 y p1 no marcados
mientras ∃p ∈ Nuevo no marcado hacer
Marcar a p
para cada σ ∈ Σ hacer
Dividir p en subconjuntos de forma que sus estados
qi y qj estarán en el mismo subconjunto
si δ(qi , σ) y δ(qj , σ) pertenecen al mismo subconjunto
fin para
si se ha dividido p en subconjuntos
entonces
Sustituir p por los nuevos subconjuntos
Desmarcar todos los estados de Nuevo
fin si
fin mientras
fin
Universidad de Córdoba: Escuela Politécnica Superior Ingenierı́a Informática 406 / 526
Procesadores de Lenguajes Tema II: Análisis Léxico
q
l 2
l l
q q
0 1 d l
d d
q
3
l l, d
p p
0 1
[ d
q q q
0 1 2
[ d
]
q q
3 4 d
]
Nota
El estado inicial q0 pertenece a p1 porque también es un estado
final
p0 = {q1 }
p2 = {q2 , q4 }
Nuevo = {p0 , p1 , p2 }
Todos los estados están desmarcados.
[
p p
1 0
d
]
p
2 d
Autómata cociente (autómata mı́nimo).
1
0 1
0 1 0 0
q q q q
0 1 2 3
1 1 1
1
0
1
q 0 q q
5 4 6
0
p0 = {q0 , q4 }
p2 = {q2 , q3 , q5 , q6 }
Nuevo = {p0 , p1 , p2 }
Todos los estados están desmarcados.
p2 = {q2 , q3 }
p3 = {q5 , q6 }
Nuevo = {p0 , p1 , p2 , p3 }
Todos los estados están desmarcados.
0 1
0 1 0
p p p
0 1 2
1
0 1
p
3
1
0 1
0 1 0 0
q q q q
0 1 2 3
1 1 1
1
0
1
q 0 q q
5 4 6
0
1 Introducción
Contenido de la sección
1 Introducción
Definición
# se ha publicado documentación sobre el tema 3 de la asignatura
de Procesadores de lenguaje
* Fundamentos teóricos del análisis sintáctico * Tipos de
generadores sintácticos
Se denomina implementación de un analizador léxico a su
codificación en un lenguaje de programación.
Nota
Se recuerda que el analizador léxico suele ser una función o
procedimiento auxiliar del analizador sintáctico.
Contenido de la sección
1 Introducción
Caracterı́sticas
Se utiliza un lenguaje de programación:
+ Alto nivel: C, C++, Pascal, Java, etc.
+ Bajo nivel: ensamblador.
Se codifica una función que combina todos los AFDs
transformados.
l, s l, s, d
q q
0 1
l, s Símbolo correcto
q q q
0 1 2
Símbolo incorrecto
σ l, s
q
3
AFD transformado.
Nota
Las celdas vacı́as de la función de transición se completan con
“rutinas” de tratamiento de errores:
δ ··· σj ···
→ q0
···
qi Error
···
Nota
Algunas veces no es necesario comprobar el sı́mbolo que sigue
al componente léxico.
Suele ocurrir con los componentes léxicos más simples:
Punto y coma
Espacio en blanco, tabular o salto de lı́nea
Operadores aritméticos
Etc.
q
= 2
<
q q
0 1
otro símbolo
q
3
Contenido de la sección
1 Introducción
COMPONENTES LÉXICOS
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
AFD
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
AFD
ANALIZADOR LÉXICO
COMPONENTES LÉXICOS
EXPRESIONES REGULARES
AFN
LEX
AFD
ANALIZADOR LÉXICO
LEX
Creado por M. E. Lesk y E. Schmidt (Bell Laboratories).
Genera analizadores léxicos para C, Fortran, Raftor.
Hay versiones para Unix, Linux, DOS, etc.
Funcionamiento de LEX
nombre.l lex.yy.c
%%
%%
Nota
Si se antepone la barra \ delante de un sı́mbolo especial entonces
sólo se representa a sı́ mismo:
\. → sólo representa el punto.
{letra}({letra}|{numero})∗
es transformada en
/* definiciones regulares */
numero [0-9]
letra [a-zA-Z]
identificador {letra}({letra}|{numero})*
1 Introducción
Contenido de la sección
1 Introducción
Tipos de errores
Invisibles: errores que no pueden ser detectados por el
procesador de lenguajes
Visibles: errores que sı́ pueden ser detectados
Errores invisibles
Suelen ser errores “conceptuales” o “algorı́tmicos”
No pueden ser detectados porque no infrigen ninguna
norma del lenguaje de programación.
Podrı́an ser detectados si se incluyen técnicas de verificación
en el procesador de lenguajes:
+ Poseen gran complejidad
+ Su coste computacional es muy elevado
En la práctica, estos errores son “detectados” y “corregidos”
manualmente
Errores visibles
Pueden ser detectados:
+ durante el proceso de traducción
+ o durante la ejecución del programa ejecutable.
Son producidos porque no se ha tenido suficiente “cuidado” al
programar:
+ falta de comprensión o desconocimiento de las
caracterı́sticas del lenguaje
+ o confusión con las caracterı́sticas de otro lenguaje.
Se caracterizan por
+ Ser errores de ortografı́a
+ Ser errores que omiten requisitos formales del lenguaje de
programación.
Errores visibles
Se clasifican según la fase en que son detectados:
Errores léxicos: no se reconoce un componente léxico correcto.
Errores sintácticos:
+ Sentencia que no respeta las reglas gramaticales del lenguaje
de programación
+ Se origina al procesar un componente léxico “inesperado”
Errores semánticos: el significado de un componente léxico es
incorrecto o inapropiado.
Errores de ejecución:
+ Funcionamiento incorrecto del programa.
+ No detectables durante el proceso de compilación.
Contenido de la sección
1 Introducción
Nota
El análisis léxico genera para fi el componente léxico
IDENTIFICADOR en vez de IF.
Este error podrá ser detectado durante el análisis sintáctico
Nota
El análisis léxico genera para fi el componente léxico
IDENTIFICADOR en vez de IF.
Este error podrá ser detectado durante el análisis sintáctico
Nota
Este error puede ser detectado durante el análisis sintáctico.
Nota
Este error puede ser detectado durante el análisis sintáctico.
Nota
Este error puede ser detectado durante el análisis semántico.
Nota
Este error puede ser detectado durante el análisis semántico.
Nota
Este error se detectará durante la ejecución.
Podrı́a ser detectado con técnicas de verificación
Nota
Este error se detectará durante la ejecución.
Podrı́a ser detectado con técnicas de verificación
Contenido de la sección
1 Introducción
Nota
Los criterios “generales” para el tratamiento de los errores son
aplicables a todos los tipos de errores.
Contenido de la sección
1 Introducción
Nota
Se debe informar de la transformación realizada.
La transformación no pretende corregir el error, sino continuar
con el análisis léxico.
Posteriormente, el programador deberá supervisar la
transformación realizada.
PROCESADORES DE LENGUAJES
TEMA II: ANÁLISIS LÉXICO