Compiladores: Análisis Léxico Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V. Análisis Léxico Programa Lenguaje Fuente Análisis Léxico (Token, Lexema) Mensajes de Error Lee los caracteres del programa fuente de izquierda a derecha, y los agrupa en tokens Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Funciones del Analizador Léxico Convierte el programa fuente en una cadena de tokens Para reconocer el token usa un patrón, una regla que describe como se forman las cadenas que corresponden a un token. Salta comentarios y espacios en blanco (tabuladores, saltos de línea...) Tener el registro de la línea del archivo fuente que está siendo analizada Genera mensajes de error léxico, y se recupera del error Convierte los valores literales al tipo que corresponda Si la entrada debe obedecer a un formato, verifica el formato Ej. Fortran, Cobol Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Tokens y Lexemas Token: Elemento básico del lenguaje Unidad léxica indivisible Identifica una entidad lógica dentro del lenguaje Incluyen: Palabras Reservadas, Constantes, Operadores, Signos de Puntuación e Identificadores Lexema: La cadena original que se identifica como token No hay correspondencia 1-1 entre token-lexema Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Tokens y Lexemas: Ejemplos Token If Token # Lexema 10 ‘if’ parentesisIzq 12 ‘(‘ Identificador 1 ‘valor’ opSuma puntoComa Menor menorIgual 30 48 56 57 ‘+’ ‘;’ ‘<‘ ‘<=‘ Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Construcción de Generadores Automáticos de Scanners Construir un NFA para cada una de las expresiones regulares a reconocer Aplicar una unión a todas las expresiones (unirlas con un mismo estado de inicio -usando transiciones Є-), pero sin unirlas en un solo estado final (se requiere un estado de aceptación para cada token de tal forma que se pueda identificar el token reconocido) Generar el DFA Hacer el programa de recorrido de DFA teniendo en cuenta que un lexema puede pasar por varios estados de aceptación (crear una lista de los estados de aceptación por los que pasó) Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Atributos para tokens El analizador recopila información sobre los tokens a medida que los reconoce. Por ejemplo: token num, pero... qué lexema? Cuando la cadena de entrada permite reconocer más de un token, esta información puede ayudar a desambiguar. Estrategias de Recuperación de Errores Léxicos Modo Pánico: obvia los siguientes caracteres de la entrada hasta encontrar un token bien formado Tratar de Arreglar la entrada: Borrar el carácter extraño Insertar el carácter perdido Reemplazar un carácter incorrecto por uno correcto Encontrar que cambio genera el menor numero de errores sintácticos, y aplicarlo Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Palabras Reservadas Identificador es una palabra que inicia con una letra, y es seguida por letras o dígitos Las palabras clave cumplen con este mismo patron de construcción Se hace necesario un mecanismo que permita decidir cuando una cadena es una palabra clave o un identificador Solución sencilla: Palabras Reservadas (que no pueden ser usadas como identificadores) Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Manejo de Buffers Cuando se implementa el scanner es necesario manejar un buffer de entrada para hacer mas eficiente la lectura de la cadena de entrada Generalmente se define un buffer del tamaño de un bloque de disco Se maneja un apuntador que marca el inicio del lexema que se está analizando, y un apuntador que marca el carácter que está siendo analizado ..... w h Begin i l e a > b \n ..... Forward Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Manejo de Buffers Posibilidades: Un buffer Final de Buffer ..... w h i l e a Begin Forward Par de Buffers i ..... w h > i l e a > Begin = ..... 1 5 2 . 5 Forward Sentinelas: marcar el final del buffer con EOF. Entonces EOF significa: Llegó al final del 1er. buffer : debe cargar el segundo Llegó al final del 2o. Buffer: debe cargar el primero Llegó al final del archivo Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Porque se divide el Análisis Léxico del Sintáctico? Simplifica y modulariza el diseño del compilador, se hace mas claro, facilita la implementación Mejora la eficiencia del compilador: El parser trabaja con Tokens, no con caracteres Uso de técnicas de buffers La mayor parte del tiempo de compilación se usa en el análisis léxico (excluyendo la optimización) Mayor portabilidad: Aísla las peculiaridades en el alfabeto de entrada Ej. El conjunto de caracteres, representación de símbolos Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón