Descarga la aplicación para disfrutar aún más
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
Compartir