Logo Studenta

ACTIVIDADES_TEMA_4 - Mauricio axel 20

Vista previa del material en texto

CARRERA: INGENERIA EN SISETMAS 
COMPUTACIONALES 
MATERIA: LENGUAJES Y AUTOMATAS I 
PROFESOR: SILVESTRE BEDOLLA SOLANO 
HORARIO: 3:00 – 4:00 PM 
GRUPO: ISC 3 
EQUIPO 2 INTEGRANTES NO.CONTROL 
1. RAMOS PÉREZ GUADALUPE INES 17320952 
2. ABARCA LÓPEZ ALBERTO JOSUÉ 18320789 
3. LOPEZ ANSELMO MAURICIO AXEL 18320904 
4. CARLOS ALBERTO CANTÚ PALACIOS 18320820 
 
 
UNIDAD 4 ANALISIS LÉXICO 
REPORTE DE PRÁCTICAS Y ACTIVIDADES DE 
APRENDIZAJE DEL TEMA 4 
FECHA DE ENTREGA 19 DE NOVIEMBRE DE 2020 
INDICE 
INTRODUCIÓN 
4.1 FUNCIONES DEL ANALIZADOR LÉXICO 
4.2 COMPONENTES LÉXICOS, PATRONES Y LEXEMAS 
4.3 CREACIÓN DE TABLAS DE TOKENS 
4.4 ERRORES LÉXICOS 
4.5 GENERADORES DE ANALIZADORES LÉXICOS 
4.6 APLICACIONES (CASO DE ESTUDIO) 
ACTIVIDAD 1 ELABORAR POR EQUIPO LA IDENTIFICACIÓN DE LEXEMAS, 
COMPONENTES LÉXICOS Y PATRONES A PARTIR DE UN LENGUAJE 
ACTIVIDAD 2 CONOCER LOS ELEMENTOS DE UNA TABLA DE TOKENS 
ACTIVIDAD 3 DEFINIR LAS REGLAS DE UN LENGUAJE DE PROGRAMACIÓN 
PROPIO 
ACTIVIDAD 4 IDENTIFICAR PATRONES VÁLIDOS, GENERAR AUTÓMATAS Y 
TABLA DE TOKENS DEL LENGUAJE PROPUESTO 
ACTIVIDAD 5 DISTINGUIR LOS ERRORES LÉXICOS 
ACTIVIDAD 6 CONSTRUIR UN ANÁLIZADOR LÉXICO MEDIANTE UN 
LENGUAJE DE PROGRAMACIÓN (UTILIZAR UN GENERADOR DE 
ANÁLIZADOR LÉXICO COMO EJEMPLO) 
CONCLUSIÓN 
REFERENCIAS 
 
INTRODUCIÓN 
Vimos que la primera fase del análisis es el análisis léxico. El principal objetivo del 
analizador léxico es leer el flujo de caracteres de entrada y transformarlo en una 
secuencia de componentes léxicos que utilizara el analizador sintáctico. Al tiempo 
que realiza esta función, el analizador léxico se ocupa de ciertas labores de 
“limpieza”. Entre ellas está eliminar los blancos o los comentarios. También se 
ocupa de los problemas que pueden surgir por los distintos juegos de caracteres o 
si el lenguaje no distingue mayúsculas y minúsculas. Para reducir la complejidad, 
los posibles símbolos se agrupan en lo que llamaremos categorías léxicas. 
Tendremos que especificar qué elementos componen estas categorías, para lo que 
emplearemos expresiones regulares. También será necesario determinar si una 
cadena pertenece o no a una categoría, lo que se puede hacer eficientemente 
mediante autómatas de estados finitos. Esta etapa está basada usualmente en 
una máquina de estados finitos. Esta máquina contiene la información de las 
posibles secuencias de caracteres que puede conformar cualquier token que sea 
parte del lenguaje (las instancias individuales de estas secuencias de caracteres 
son denominados lexemas). Por ejemplo, un token de naturaleza entero puede 
contener cualquier secuencia de caracteres numéricos. Un analizador 
léxico o analizador lexicográfico (en inglés scanner) es la primera fase de 
un compilador, consistente en un programa que recibe como entrada el código 
fuente de otro programa (secuencia de caracteres) y produce una salida compuesta 
de tokens (componentes léxicos) o símbolos. Estos tokens sirven para una 
posterior etapa del proceso de traducción, siendo la entrada para el analizador 
sintáctico (en inglés parser). La especificación de un lenguaje de programación a 
menudo incluye un conjunto de reglas que definen el léxico. Estas reglas consisten 
comúnmente en expresiones regulares que indican el conjunto de posibles 
secuencias de caracteres que definen un token o lexema. En algunos lenguajes de 
programación es necesario establecer patrones para caracteres especiales (como 
el espacio en blanco) que la gramática pueda reconocer sin que constituya 
un token en sí. 
https://es.wikipedia.org/wiki/Aut%C3%B3mata_finito
https://es.wikipedia.org/wiki/Idioma_ingl%C3%A9s
https://es.wikipedia.org/wiki/Compilador
https://es.wikipedia.org/wiki/Programa_(inform%C3%A1tica)
https://es.wikipedia.org/wiki/C%C3%B3digo_fuente
https://es.wikipedia.org/wiki/C%C3%B3digo_fuente
https://es.wikipedia.org/wiki/Token_(programaci%C3%B3n)
https://es.wikipedia.org/wiki/Analizador_sint%C3%A1ctico
https://es.wikipedia.org/wiki/Analizador_sint%C3%A1ctico
https://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n
https://es.wikipedia.org/wiki/L%C3%A9xico
https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
https://es.wikipedia.org/wiki/Lexema
4.1 FUNCIONES DEL ANALIZADOR LÉXICO 
Leer los caracteres de entrada y elaborar como salida una secuencia 
de componentes léxicos que utiliza el analizador sintáctico para hacer el análisis. El 
analizador léxico es la primera fase de un compilador. Su principal función consiste 
en leer los caracteres de entrada y elaborar como salida una secuencia de 
componentes léxicos que utiliza el analizador sintáctico para hacer el análisis. 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. 
DEFINICIÓN DE ANALIZADOR LÉXICO 
 El analizador léxico es una herramienta de un compilador que nos ayuda a leer los 
caracteres de entrada para formar componentes y así poder identificarlos y pasar la 
información a analizadores sintáctico. 
 Los componentes léxicos representan: 
 Palabras reservadas: if, while, do ect. 
Operadores. =+-*/== > <!=.. 
Constantes numéricas 
Constantes de caracteres 
¿CUÁL ES SU FUNCIÓN? 
Construye elementos léxicos llamados patrones que serán utilizados posteriormente 
por un analizador sintáctico. Un patrón es una pareja ordenada compuesta por un 
tokens y un lexema. Un lexema es la 
secuencia de caracteres que 
coinciden con tokens. Un analizador 
léxico aísla el analizador sintáctico 
de la representación de lexemas de 
los componentes léxicos. 
El analizador léxico opera bajo petición 
del analizador sintáctico devolviendo 
un componente léxico conforme el 
analizador sintáctico lo va necesitando 
para avanzar en la gramática. Los 
componentes léxicos son los símbolos 
terminales de la gramática. Suele 
implementarse como una subrutina 
del analizador sintáctico. Cuando 
recibe la orden obtén el siguiente 
componente léxico, el analizador 
léxico lee los caracteres de entrada 
hasta identificar el siguiente 
componente léxico. 
FUNCIONES SECUNDARIAS 
Como el analizador léxico es .la parte del compilador que lee el texto fuente. 
También puede realizar 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 os 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. 
OTRAS FUNCIONES 
• Manejo del fichero de entrada del programa fuente: abrirlo, leer sus 
caracteres, 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). 
• Inclusión de ficheros: # include... 
• La expansión de macros y funciones in line: # define... 
• Contabilizar el número de líneas y columnas para emitir mensajes de error. 
• Reconocimiento y ejecución de las directivas de compilación (por ejemplo, 
para depurar u optimizar el código fuente). 
4.2 COMPONENTES LÉXICOS, PATRONES Y LEXEMAS 
SALIDA DEL ANALIZADOR LÉXICO 
 A la salida del analizador léxico es un conjuntode tokens 
Ejemplo: 
• Identificadores 
• Enteros 
• Palabras reservadas 
• Espacios en blanco 
• Paréntesis 
 
 
TOKENS 
❖ Símbolos terminales de una gramática 
❖ Identificadores, palabras reservadas, operadores,... 
❖ Varios signos pueden forman el mismo token 
Un token es un par que consiste en un nombre de token y un valor de atributo 
opcional. El nombre del token es un símbolo abstracto que representa un tipo de 
unidad léxica; por ejemplo, una palabra clave específica o una secuencia de 
caracteres de entrada que denotan un identificador. Los nombres de los tokens son 
los símbolos de entrada que procesa el analizador sin táctico. A partir de este 
momento, en general escribiremos el nombre de un token en negrita. Con frecuencia 
nos referiremos a un token por su nombre. 
ATRIBUTOS 
Información adicional que tiene el token, de utilidad para el análisis sintáctico y 
semántico. 
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. Un lexema es una secuencia de caracteres en el programa 
fuente, que coinciden con el patrón para un token y que el analizador léxico identifica 
como una instancia de ese token. 
PATRÓN 
Descripción de la forma que han de tomarlos lexemas para ajustarse a un 
componente léxico. Un patrón es una descripción de la forma que pueden tomar 
los lexemas de un token. En el caso de una palabra clave como token, e l patrón es 
sólo la secuencia de caracteres que forman la palabra clave. Para los identificadores 
y algunos otros tokens, el patrón es una estructura más compleja que se relaciona 
mediante muchas cadenas. 
 
 
 
 
 
 
 
4.3 CREACIÓN DE TABLAS 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: 
o 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. 
o 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. 
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 estos 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 porque 
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: 
• Reportar clara y exactamente la presencia de errores 
• Recuperarse de cada error lo suficientemente rápido para poder detectar 
errores subsiguientes: 
• Tratar de evitar mensajes falsos de error. 
• Un error que produce un token erróneo. 
• 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. 
4.5 GENERADORES DE ANALIZADORES LÉXICOS 
Se pueden usar varias técnicas para acelerar el algoritmo y ahorrar espacio 
Las etiquetas pueden guardarse mediante dispersión para producir un sistema de 
firmas que acelere sus búsquedas 
Como las tablas de transiciones son muy escasas, se pueden guardar en una lista 
corta que se consulte cada vez que se necesite hacer una transición a partir de un 
estado. 
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. 
 
 
 
ACTIVIDAD 1 ELABORAR POR EQUIPO LA IDENTIFICACIÓN DE 
LEXEMAS, COMPONENTES LÉXICOS Y PATRONES A PARTIR DE 
UN LENGUAJE 
Componente léxico (token) 
 
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 representauna 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 
 
http://3.bp.blogspot.com/_uxc4Qw8TRdA/TOB3CMG6OTI/AAAAAAAAAAw/hD17qNVbPwE/s1600/compilador.png
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. 
 
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. 
 
Atributos de los componentes léxicos 
 
El analizador léxico recoge información sobre los componentes léxicos en sus 
atributos asociados. Los componentes léxicos influyen en las decisiones del análisis 
sintáctico y los atributos en la traducción de los componentes léxicos: 
- Apuntador a la entrada de la Tabla de símbolos donde se guarda la información 
sobre el componente léxico. 
- El lexema para un identificador 
- El número de línea en que se encontró por primera vez. 
Un analizador léxico lee carácter a carácter del programa fuente y genera una 
secuencia de componentes léxicos (tokens) que corresponden a unos patrones a 
los que asocia, si es necesario, unos atributos. 
 
El análisis léxico es un análisis de los caracteres – Parte de éstos y por medio de 
patrones reconoce los lexemas – Envía al analizador sintáctico el componente 
léxico y sus atributos – Puede hacer tareas adicionales: eliminar blancos, control 
líneas … 
 
• El analizador léxico y el sintáctico forman un par productor-consumidor. 
• En algunas situaciones, el analizador léxico tiene que leer algunos caracteres por 
adelantado para decidir de qué token se trata. 
 
 
 
 
 
 
ACTIVIDAD 2 CONOCER LOS ELEMENTOS DE UNA 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. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ACTIVIDAD 3 DEFINIR LAS REGLAS DE UN LENGUAJE DE 
PROGRAMACIÓN PROPIO 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ACTIVIDAD 4 IDENTIFICAR PATRONES VÁLIDOS, GENERAR 
AUTÓMATAS Y TABLA DE TOKENS DEL LENGUAJE 
PROPUESTO. 
Los AFD se pueden utilizar para reconocer las expresiones regulares asociadas a 
los componentes léxicos. 
Identificadores 
identifier = letter (letter | digit)* 
 
Números naturales y reales 
nat = [0-9]+ 
 signedNat = (-)? nat 
number = signedNat(‘‘.’’nat)? (E signedNat)? 
 
Operadores relacionales 
 
El símbolo * indica que se debe hacer un retroceso en la entrada pues se ha 
consumido un símbolo demás, que no pertenece al lexema del componente léxico 
que se devuelve. 
Supongamos que queremos reconocer identificadores: 
 
Mediante bucles anidados 
Usamos 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 se corresponden con asociar un nuevo 
estado a la variable y avanzar en la entrada. 
ch=next input char; 
state = 1; 
while (state == 1 o 2) do 
case state 
1: case ch 
letter : avanzar en la entrada; state=2; 
otro caso : state = error u otro 
fin case; 
2: case ch 
letter, digit : avanzar en la entrada; state=2 (no necesario); 
otro caso : state = 3; fin case; 
fin case; 
fin while; 
if (state==3) then aceptar else error; 
 
El código que se genera es largo y difícil de mantener en el caso de que se 
introduzcan nuevos caracteres en el alfabeto de entrada o nuevos estados. 
Mediante una tabla de transiciones. 
 
Se asume que los campos en blanco son errores. Los estados de aceptación se 
marcan con una columna adicional. Los corchetes representan que no se tiene 
que consumir un carácter en la entrada (no avanzar). 
state = 1; 
 ch = next input character; 
while (not Accept[state]) and (not error(state)) do 
newstate = T[state,ch]; 
if Advance[state,ch] then ch=next input char; 
state=newstate; 
end while; 
if Accept[state] then accept; 
Advance y Accept son dos arrays booleanos indexados por el estado y por el 
carácter en la entrada. El primero indica si tenemos que avanzar en la entrada. El 
segundo si tenemos un estado de aceptación. Ventajas: el código es reducido y 
fácil de mantener, sirve para cualquier analizador, las modificaciones se realizan 
solo en la tabla. Desventajas: tablas de gran tamaño, se incrementa el espacio 
necesario (velocidad algo reducida respecto al método anterior). Este método es el 
que utiliza Flex (Linux) y Lex (Unix). Coste: O(|x|), es independiente del tamaño del 
autómata. 
 
 
 
ACTIVIDAD 5 DISTINGUIR LOS 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 necesitanlos métodos de especificación y reconocimiento de 
patrones, y estos 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 porque 
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: 
• Reportar clara y exactamente la presencia de errores 
• Recuperarse de cada error lo suficientemente rápido para poder detectar 
errores subsiguientes: 
• Tratar de evitar mensajes falsos de error. 
• Un error que produce un token erróneo. 
• 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. 
ACTIVIDAD 6 CONSTRUIR UN ANÁLIZADOR LÉXICO MEDIANTE 
UN LENGUAJE DE PROGRAMACIÓN (UTILIZAR UN GENERADOR 
DE ANÁLIZADOR LÉXICO COMO EJEMPLO) 
1. Creación básica del proyecto 
2. Las reglas léxicas del JFlex 
3. La creación de la enumeración de tokens que se utilizara en las reglas 
léxicas 
4. La creación de la clase java en el analizador léxico que nos permitirá el 
analizar las cadenas. 
5. El uso de dicha clase para analizar las cadenas 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1. Abrimos la aplicación de Java NetBeans IDE 8.2 
2. Seleccionamos la carpeta que será para crear un nuevo proyecto y damos 
clic 
3. Nos abrirá una ventana donde seleccionaremos la carpeta Java y damos 
clic 
4. Seleccionamos la opción de Java Application, damos clic. 
5. Nos abrirá una venta y en Project Name: escribimos AnalizadorLexico 
6. Deshabilitamos la opción de Create Main Class ya que por el momento no 
requerimos de una clase principal 
7. Damos clic en Finish para que se cargue el proyecto 
8. Una vez creado el proyecto nos dirigimos hacia donde dice 
AnalizadorLexico 
9. Seleccionamos el Source Packages y damos clic derecho 
10. Buscamos la opción de New, luego escogemos como siguiente opción Java 
Package (esto nos servirá para crear un paquete donde se incluirán todas 
nuestras clases) damos clic 
11. Nos abrirá una ventana donde nos dirigiremos hacia Package Name y 
escribiremos en minúsculas código y damos clic en Finish 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12. Nos vamos al apartado de Librares dando clic derecho y damos clic en la 
opción de Add JAR/Folder... 
13. Nos abre una ventana donde damos clic en documentos y buscamos 
nuestro generador léxico que anteriormente ya habíamos descargado en 
este caso yo escogí el JFlex lo selecciono y damos clic en abrir. 
 
14. Ahora pasaremos a crear nuestras reglas léxicas del analizador léxico 
15. Nos vamos al apartado donde dice código damos clic derecho nos vamos a 
la opción de new damos clic y luego nos dirigimos hacia la opción de other y 
damos clic 
16. Nos abrirá una ventana buscamos y seleccionamos en categories la carpeta 
de other damos clic 
17. Ahora en el apartado File Types buscamos y seleccionamos la opción de 
Empty File dando clic en Next 
18. Se abrirá una ventana donde seleccionaremos la opción File Name 
escribiremos Lexer.flex (este archivo que creamos será el que incluirá las 
reglas léxicas) damos clic en Finish 
 
 
 
 
 
 
 
 
 
19. Este será el código que utilizaremos en el apartado de Lexer.flex se podría 
decir l clase que creamos 
 
20. Les hablare un poco de lo que se trata el código 
 
• Package código; Se refiere a la ubicación del paquete donde se 
encuentra el código 
• Import static código.tokens.*; Se refiere a la clase de enumeración 
donde incluirán todos los tokens de nuestro analizador léxico 
• Entre los 2 pares de signos de % % están incluidos todas las 
declaraciones que ocuparemos 
• %class Lexer Se refiere que lleva el mismo nombre que el archivo o 
clase que es Lexer.flex 
• %type Tokens Se refiere a la numeración 
• L=[a-z A-Z_]+ Se refiere al lenguaje donde incluye letras de la a-z en 
mayúscula y minúscula y se agrega un + para analizar o leer hasta 
que se encuentre un espacio 
• D=[0-9]+ Igual que el anterior este incluye todos los números del 0 al 
9 y el + es para leer o analizar hasta que este se encuentre un espacio 
• Espacio=[ ,\t,\r,\n]+ Colocaremos los espacios que el analizador léxico 
ignorara seria espacio, t(tabulador), n(salto de linea) y el + se coloca 
en caso de que se encuentre mas de uno 
• %{ public String Lexeme; %} Esto se refiera al que el código que 
estamos realizando será en Java se necesitara crear una clase publica 
• (int |, if |, else |, while { lexeme = yytext(); return Reservadas; } En este 
apartado se pondrán todas las palabras clásicas reservadas de 
nuestro código, el yytext nos servirá para analizar las cadenas 
• {espacio} {/*Ignore*/} Se refiera que se ignoraran todos los espacios 
dentro del código 
• “//” .*{/*Ignore*/} Se refiere que también ignorara los comentarios 
• A continuación se colocara los símbolos matemáticos con sus 
respetivos regresos 
• “=” {return Igual;} 
• “+” {return Suma;} 
• “-“ {return Menos;} 
• “*” {return Multiplicación;} 
• “/” {return Division;} 
• {L} ({L} | {D}) * {lexeme = yytext(); return Identificador;} Es una regla 
sintáctica que nos permite abrasar los identificadores, como regla 
tiene que iniciar por una letra o numero 
• (“ (-“{D}+”) | {D}+{lexeme = yytext); return Numero;} Aqui van los 
números que este va de un digito dirigido por otro digito 
• . {return ERROR;} El espacio seguido por un punto y espacio nos 
avisara los posibles errores dentro del programa 
21. Una vez creada las reglas léxicas procederemos a crear la clase tokens de 
enumeración 
22. Nos dirigiremos al apartado de código dando clic derecho damos clic en New 
y luego nos dirigimos a other dan clic 
23. Nos abrirá una ventana damos clic en la opción Java y luego seleccionamos 
la opción Java Enum dando clic en Next 
24. Escribimos en el apartado Class Name: Tokens damos clic en Finish 
25. Una vez ya creada la clase Tokens en el apartado public enum Tokens { } se 
incluirán o escribirán todas las palabras o return de la clase Lexer.flex, 
empezando por la palabra Reservada seguida de igual, etc. Una vez ya 
escritas todas las palabras se procederá a guardarse la clase para que no 
haya ningún cambio o se vaya a perder la clase. 
 
26. Ahora se procederá a realizar la clase Java analizador léxico 
27. Nos vamos al apartado código damos clic derecho y nos vamos a la opción 
de New damos clic y seleccionamos la opción Java Class damos clic 
28. Nos abrirá una ventana en Class Name le pondremos por nombre Principal 
y damos clic en Finish 
 
 
 
 
29. Una vez creada la clase esta nos permitirá crear el analizador Léxico 
30. En el apartado public Class Principal {} Se declarara las letras psvm damos 
doble espacio para que nos aparezca public Static void main (String[] args){} 
31. Creamos un nuevo String ruta para saber donde se encuentra el archivo 
Lexer.flex 
32. Nos dirigiremos al apartado de Source Packages damos clic derecho 
seleccionamos la opción Properites y damos clic 
33. Nos abrirá una ventana seleccionamos donde dice Project Folder copiamos 
la ruta 
34. La ruta que copiamos la pegamos en el apartado String ruta = “ ” 
35. Crearemos un nuevo método que sea publico donde se generara el Lexer y 
se importara el File. 
36. Una vez hecho todo lo anterior damos clic derecho y seleccionamos la opción 
de Run File y damos clic 
37. Se abrirá una pestaña en la parte de abajo que nos indicará que todo esta 
bien y creará la clase Lexer.java del analizador léxico si está correcto 
38. Abrimos la clase Lexer.java donde veremos la clase que utiliza java para 
analizar todas las cadenas que analizaremos 
 
 
 
 
39. Ahora procederemos a crear freen que nos permitirán analizar la cadena con 
el leer que acabos de crear 
40. Nos vamos al apartado código damos clic derecho seleccionamos la opción 
New damos clic y seleccionamos la opción de JFrame From y damos clic 
41. Nos abrirá una ventana nos vamos al apartado de Class Name escribimos 
FrmPrincipal damos clic en Next y nos creará la ventana de java 
42. Nos vamos a la parte de Palete seleccionamos el Text Feld utilizaremos esta 
opción para que entre la cadena para que nos analice un treearear lo que es 
una palabra reservada. 
43. Seleccionamos el Text Feld damos clic derecho nos vamos a properties 
seleccionamos la opción foot para agrandar la letra al tamaño 24 damos clic 
en ok y luego en close 
44. Volvemos a seleccionar Text Feld damos clic derecho seleccionamos la 
opción de Edit Text damos clic 
45. Volvemos a dar clic derechos seleccionamos la opción Change Variable 
Name.. damos clic para poder cambiar la variable a txtEntrada es una buena 
practica para no perder el nombre de los objetos que estamos creando damo 
clic en ok 
46. Volvemos a la opción de Palette buscamos la opción de Button lo colocamos 
a un lado del Text Feld damos clic derechos nos vamos a properties y damos 
clic en front para grandar el texto o fondo a tamaño 24 volvemos a dar clic 
derecho seleccionamos Edit Text escribimos Analizar damos clic derechs y 
escogemos la opción de Change Variable Name escribimos btnAnalizar 
damos clic en ok 
47. Volvemos a palette seleccionamos la opción de Text Area damos clic derecho 
nos vamos a Change Variable Name escribimos txtResultado damos clic en 
ok guardamos todo lo que hemos hecho anteriormente 
 
 
 
 
 
 
 
 
 
 
48. Ahora nos vamos donde dice Analizar y damos doble clic seleccionamos la 
opción Events damos clic y seleccionamos la opción Action dándole clic y 
escogemos la opcón actionPerformed damos clic. 
49. Nos lleva directamente a private void 
btnAnalizarActionPerformed(java.awt.event.ActionEvent evt) { //TODO add 
your handling code here: } 
50. Dentro de lo anterior escribiremos un código donde importaran librería 
51. Fuera de este código damos doble enter para empezar a utilizar el 
analizador léxico utilizaremos un Reader lector = new BufferredReader(new 
FileReader (se pone el nombre del archivo que creamos)) e importaremos 
librerías 
52. Seria todo el código para el analizador lexico 
53. Ahora pasaremos a probar damos clic derecho seleccionamos la opción 
Run File damos clic 
54. Ahora nos aparecerá una ventana en la parte de abajo como también en la 
parte de arriba 
55. Ahora nos vamos a la parte superior de arriba de la clase FrmPrincipal.java 
y nos dirigimos al apartado del código public FrmPrincipal() { escribiremos 
el siguiente código que sera para que al probar el código y la pantalla a 
parezca en el medio esto es solo un extra si ustedes quieren optar por esta 
opción 
56. Pones a prueba la pantalla escribiendo if y luego damos clic en analizar y 
asi utilizando otras palabras para poder obtener el resultado 
 
 
 
CONCLUSIÓN 
• El analizador léxico divide la entrada en componentes léxicos. 
• Los componentes se agrupan en categorías léxicas. 
• Asociamos atributos a las categorías léxicas. 
• Especificamos las categorías mediante expresiones regulares. 
• Para reconocer los lenguajes asociados a las expresiones regulares 
empleamos autómatas de estados finitos. 
• Se pueden construir los AFD directamente a partir de la expresión regular. 
• El analizador léxico utiliza la máquina discriminadora determinista. 
• El tratamiento de errores en el nivel léxico es muy simple. 
• Podemos implementar la MDD de dos formas: con tablas, mediante control 
de flujo. 
• Hay generadores automáticos de analizadores léxicos, por ejemplo, 
metacomp. 
• Se pueden emplear las ideas de los analizadores léxicos para facilitar el 
tratamiento de ficheros de texto. 
• Para empezar, se debe entender el proceso de compilación para que la 
máquina entienda el lenguaje a analizar, esto inicia con el léxico. 
• Los autómatas son para poder entender el proceso del compilador, cuando 
pasa por diferentes estados para llegar a su estado final. 
 
 
 
 
 
 
 
REFERENCIAS 
Desconocido. (16 de Noviembre de 2020). Automatas y Compiladores. Obtenido de 
http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro32/22_componentes_lxicos_patr
ones_y_lexemas.html 
Eder, K. (26 de Julio de 2015). Prezi. Obtenido de Tabla de TOKENS: 
https://prezi.com/wzrdviampbgj/tabla-de-tokens/ 
Manzanero, C. (15 de Mayo de 2017). LENGUAJES Y AUTOMATAS 1 UNIDADES. Obtenido de Tabla 
de Tokens: https://lenguajesyautomatasblog.wordpress.com/2017/05/15/tabla-de-
tokens/ 
Unknown. (16 de Junio de 2015). ANÁLIZADOR LÉXICO. Obtenido de 
http://lenguajesautomatasi.blogspot.com/2015/06/analizador-lexico-y-sus-funciones.html

Otros materiales

Materiales relacionados

111 pag.
TutorialPython3

SIN SIGLA

User badge image

matica121314

285 pag.
Python_facil

SIN SIGLA

User badge image

mario_roldan123

5 pag.
Tarea1_Buffers_TGJL

UNAM

User badge image

Jorge Luis Tellez

Preguntas relacionadas