3. ANALISIS LEXICO
FUNCION DEL ANLIZADOR LEXICO
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.
En algunas ocasiones, los analizadores léxicos se dividen
en una cascada de dos fases; la primera, llamada "examen",
y la segunda, "análisis léxico". El examinador se encarga de
realizar tares sencillas, mientras que el analizador léxico es el
que realiza las operaciones complejas.
4. ASPECTO DEL ANALISIS LEXICO
Hay varias razones para dividir la fase de análisis de la
compilación en análisis léxico y análisis sintáctico.
Un diseño sencillo es quizá la consideración más importante.
Separar el análisis léxico del análisis sintáctico a menudo permite
simplificar una u otra de dichas fases.
Se mejora la eficiencia del compilador. Un analizador léxico
independiente permite construir un procesador especializado y
potencialmente más eficiente para esta función. Gran parte de
tiempo se consume en leer el programa fuente y dividirlo en
componentes léxicos. Con técnicas especializadas de manejo de
buffer para la lectura de caracteres de entrada y procesamiento de
componentes léxicos se puede mejorar significativamente el
rendimiento de un compilador.
Se mejora la transportabilidad del compilador. Las
peculiaridades del alfabeto de entrada y otras anomalías propias
de los dispositivos pueden limitarse al analizador léxico.
5. COMPONENTES LEXICOS, PATRONES Y LEXEMAS
Cuando se menciona el análisis sintáctico, los términos
"componente léxico"(token), "patrón" y "lexema" se emplean
con significados específicos.
En general, hay un conjunto de cadenas en la entrada para
el cual se produce como salida el mismo componente léxico.
Este conjunto de cadenas se describe mediante una regla
llamada patrón asociado al componente léxico. Se dice que
el patrón concuerda con cada cadena del conjunto.
Lexema es una secuencia de caracteres en el programa
fuente con la que concuerda el patrón para un componente
léxico.
Los componentes léxicos se tratan como símbolos
terminales de la gramática del lenguaje fuente, con nombres
en negritas para representarlos.
6. ATRIBUTOS DE LOS COMPONENTES LEXICOS
Cuando concuerda con un lexema más de un patrón, el
analizador léxico debe proporcionar información adicional
sobre el lexema concreto que concordó con las fases del
compilador.
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.
En la práctica, los componentes léxicos suelen tener un
solo atributo – un apuntador a la entrada de la tabla de
símbolos donde se guarda la información sobre el
componente léxico; el apuntador se convierte en el atributo
del componente léxico.
7. CARACTERÍSTICAS DEL ANÁLISIS LÉXICO
Lee caracteres.
Produce componentes léxicos (tokens).
Filtra comentarios.
Filtra separadores múltiples (espacios, tabuladores y
saltos de línea).
Lleva el contador de línea y columna del texto fuente.
Genera errores en caso de que la entrada no corresponda
a ninguna categoría léxica.
8. ALGUNAS DEFINICIONES
Categoría léxica: Tipo de símbolo elemental del lenguaje
fuente, (identificadores, palabras
numéricas, operadores, ...).
clave,
constantes
Componente léxico (token): Elemento perteneciente a
una categoría léxica.
Atributos de un componente: Información del
componente necesaria en etapas posteriores del análisis
(valor de la constante, nombre de una variable, ...).
Lexema: Cadena de caracteres correspondiente al
componente léxico.
9. ANALISIS SINTACTICO
comprueba que las sentencias que componen el texto fuente
son correctas en el lenguaje, creando una representación
interna que corresponde a la sentencia analizada.
De esta manera se garantiza que sólo serán procesadas las
sentencias que pertenezcan al lenguaje fuente. Durante el
análisis sintáctico, así como en las demás etapas, se van
mostrando los errores que se encuentran.
10. RAZONES POR LAS QUE SE SEPARA LA FASE DE
ANÁLISIS DE UN COMPILADOR EN ANÁLISIS
LEXICOGRÁFICO Y ANÁLISIS SINTÁCTICO.
En el diseño del analizador sintáctico, éste no ha de
preocuparse de leer el archivo de entrada, ni de saltar blancos, ni
comentarios, ni de recibir caracteres inesperados, puesto que todo
ello ha sido filtrado previamente por el analizador lexicográfico.
Se mejora la eficiencia del compilador en su conjunto. La
lectura del programa fuente suele requerir gran parte del tiempo de
compilación, que se ve reducido si el analizador lexicográfico
incorpora técnicas especiales de lectura, o está realizado en
ensamblador.
Aumenta la portabilidad del compilador, ya que todas las
diferencias que se produzcan en el alfabeto de entrada, o en el
dispositivo de almacenamiento, pueden ser reducidas al
analizador lexicográfico, dejando al analizador sintáctico intacto.
11. FUNCIÓN DEL ANÁLISIS SINTÁCTICO
Analizar sintácticamente una cadena de tokens no es más
que encontrar para ella el árbol sintáctico o de derivación
que tiene como raíz el axioma de la gramática, y como
nodos terminales la sucesión ordenada de símbolos que
componen la cadena analizada.
En caso de no existir este árbol sintáctico, la cadena no
pertenecerá al lenguaje, y el analizador sintáctico ha de
emitir el correspondiente mensaje de error.
Existen dos formas de analizar sintácticamente una
cadena:
12. ANÁLISIS DESCENDENTE: Partiendo del axioma inicial de la
gramática se va descendiendo utilizando las derivaciones
izquierdas, hasta llegar a construir la cadena analizada.
Análisis ascendente: Se va construyendo el árbol desde sus
nodos terminales. Es decir, se construye desde los símbolos de la
cadena hasta llegar al axioma de la gramática.
Simultáneamente a la fase de análisis sintáctico, además de reconocer
las secuencias de tokens, y analizar su estructura, pueden realizarse
una serie de tareas adicionales, como:
Recopilar información de los distintos tokens y almacenarla en la
tabla de símbolos.
Realizar algún tipo de análisis semántico, tal como la comprobación
de tipos.
Generar código intermedio.
Avisar de los errores que se detecten.