Análisis lexicográfico lexicográfico
Figura 2.1. Entradas y salidas de las dos primeras fases de la etapa de análisis. La frase “Secuencia de Terminales” hace referencia a la gramática del sintáctico; pero también es posible posibl e considerar que dicha secuencia es de no terminales si usamos el punto de vista del lexicográfico.
El analizador léxico reconoce las palabras en función de una gramática regular de manera que el alfabeto de dicha gramática son los distintos caracteres caracteres del juego de caracteres del ordenador sobre el que se trabaja (que forman el con junto de símbolos terminales), terminales), mientras que sus no terminales son las categorías léxicas en que se integran las distintas secuencias de caracteres. Cada no terminal o categoría léxica de la gramática regular del análisis análisis léxico es considerado como u n terminal de la gramática de contexto libre con la que trabaja el analizador sintáctico, sintáctico, de manera que la salida de alto nivel (no terminales) de la fase léxica supone la entrada de bajo n ivel (terminales) de la fase sintáctica. En el caso de Lex, por ejemplo, la gramática regular se expresa mediante expresiones regulares.
2.2. 2.2.1 1
Func Funcio ione ness del del anal analiz izad ador or léxico léxico
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
Figura 2.2. La fase de análisis léxico se halla bajo el control del análisis sintáctico. Normalmente se implementa como una función de éste
24
Java a tope: Traductores y compiladores con Lex/Yacc, JFlex/Cup y JavaCC interacción suele aplicarse convirtiendo al analizador léxico en una subrutina o corrutina del analizador sintáctico. Recibida la orden “Dame el siguiente componente léxico”del analizador sintáctico, el léxico lee los caracteres de entrada hasta que pu eda identificar el siguiente componente léxico, el cual devuelve al sintáctico según el formato convenido (ver figura 2.2). de gran • • •
• • •
Además de esta función principal, el analizador léxico también realiza otras imp ortancia, a saber: Eliminar los comentarios del programa. Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general, todo aquello qu e carezca de significado según la sintaxis del lenguaje. Reconocer los identificadores de usuario, números, palabras reservadas del lenguaje, etc., y tratarlos correctamente con respecto a la tabla de símbolos (solo en los casos en que este analizador deba tratar con dicha estructura). Llevar la cuenta del número de línea por la que va leyendo, por si se produce algún error, dar información acerca de dón de se ha producido. Avisar de errores léxicos. Por ejemplo, si el carácter ‘@’ no pertenece al lenguaje, se debe emitir un error. También puede hacer funciones de preprocesador.
2.2.2
Necesidad del analizador léxico
Un buen profesional debe ser capaz de cuestionar y plantearse todas las decisiones de diseño que se tomen, y un asunto imp ortante es el porqué se separa el análisis léxico del sintáctico si, al fin y al cabo, el control lo va a llevar el segundo . En otras palabras, por qué no se delega todo el procesamiento del programa fuente sólo en el análisis sintáctico, cosa perfectamente posible (aunque no plausible como veremos a continuación), ya q ue el sintáctico trabaja con gramáticas de contexto libre y éstas engloban a la regulares. A continuación estudiaremos algunas razones de esta separación.
2.2.2.1 Simplificación del diseño Un diseño sencillo es quizás la ventaja más importante. Separar el análisis léxico del análisis sintáctico a menudo permite simplificar una, otra o ambas fases. Norma lm en te añad ir un an ali za do r léxico perm ite simp lif icar no tabl em en te el analizador sintáctico. Aún más, la simplificación obtenida se hace especialmente pa tent e cu an do es ne cesario real izar mo di ficacion es o extensio ne s al len gu aje inicialmente ideado; en otras palabras, se facilita el mantenimiento del compilador a medida que el lenguaje evoluciona. La figura 2.3 ilustra una situación en la que, mediante los patrones correspondientes, el analizador léxico reconoce números enteros y operadores aritméticos. A la hora de construir una primera versión del analizador sintáctico, 25