ANALISIS LÉXICO
Francina Lantigua 100293736
Euris Alexander Perez 100343891
Anabel Duarte Burgos 100216430
Wander Arias Tavarez 100215067
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
Funciones del analizador léxico
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.
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 esta 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.
Las expresiones regulares
son una forma de especificar patrones, entendiendo por patrón la forma de describir
cadenas de caracteres. Es la forma de definir los tokens o componentes léxicos
Vemos que para describir un identificador que se define solo por letras utilizando el patrón [a-zAZ]+, que reconoce
cualquier letra mayúscula o minúscula seguido del símbolo +, estamos indicando que al menos tiene que haber una letra
para describir un identificador, pero no hay límite para el número de caracteres que puede tener ese token
Para definir las expresiones regulares usamos metacaracteres o metasímbolos que especifican las acciones que se
pueden reconocer sobre un determinado carácter o símbolo. Algunos de estos metacaracteres son: *, +, ?, |. Cuando
queremos utilizar estos símbolos, como por ejemplo * con su significado normal, para la operación de multiplicar se
utiliza un carácter de escape que anula el significado especial del metacarácter. En este ejemplo la forma correcta
sería \*, y así tenemos el símbolo de multiplicar en un patrón.
Operaciones con expresiones regulares
Hay tres operaciones básicas con expresiones
regulares:
Los tokens se pasan como valores
“simples”. Algunos tokens requieren algo
más que su propia identificación:
• Constantes: su valor
• Identificadores: el string
• Operadores relacionales: su
identificación
Por lo tanto, el scanner debe realizar, a
veces, una doble función:
Identificar y “evaluar” el token.
Un token se corresponde con un patrón y a su vez se
puede corresponder con muchos
Tokens más habituales:
• Palabras reservadas
• Identificadores
• Operadores
• Constantes
• Símbolos de puntuación
• Símbolos especiales: ( ) [ ]
Pero, a la vez que el propio token, el scanner debe devolver más información, tal como si
es un token que tiene un valor CONSTANTE, si es un identificador, es decir, el string
correspondiente y si es un símbolo de puntuación, definir cuál.
Esta información, se devuelve mediante atributos y además puede detectar algunos
errores léxicos, es decir, si no hay concordancia con ningún patrón, también puede llevar a
cabo algunas recuperaciones de errores, filtrado de caracteres extraños, completar algún
patrón y reemplazar algún carácter.
TABLA DE SIMBOLOS
En informática, una tabla de
símbolos es una estructura de datos
que usa el proceso de traducción de un
lenguaje de programación, por un
compilador o un intérprete, donde
cada símbolo en el código fuente de
un programa está asociado con
información tal como la ubicación, el
tipo de datos y el ámbito de cada
variable
Consideraciones sobre la Tabla de
Símbolos
La tabla de símbolos puede iniciarse con cierta
información útil, tal como: Constantes, Funciones de
librería y Palabras reservadas. Esto facilita el trabajo al
lexicográfico, que tras reconocer un identificador lo busca
en la tabla de símbolos, y si es palabra reservada devuelve
un token asociado. Bien estructurado puede ser una
alternativa más eficiente al lex tal y como lo hemos visto .
Conforme van apareciendo nuevas declaraciones de
identificadores, el analizador léxico, o el analizador
sintáctico según la estrategia que sigamos, insertará
nuevas entradas en la tabla de símbolos, evitando siempre
la existencia de entradas repetidas.
El analizador semántico efectúa las comprobaciones sensibles al contexto gracias a la tabla de
símbolos, y el generador de código intermedio usa las direcciones de memoria asociadas a cada
identificador en la tabla de símbolos, al igual que el generador de código. El optimizador de código
no necesita hacer uso de ella
La tabla de símbolos contiene información útil para poder compilar, por tanto existe en tiempo de compilación, y no
de ejecución. Sin embargo, en un intérprete, dado que la compilación y ejecución se producen a la vez, la tabla de
símbolos permanece todo el tiempo.
Generadores para analizadores
lexicógrafos
Analizador Léxico
Un analizador léxico es un modulo destinado a leer
caracteres del archivo de entrada, donde se
encuentra la cadena a analizar reconocer
subcadenas que correspondan a símbolos del
lenguaje y retornar los tokens correspondientes y
sus atributos.
Generador LEX
Es un programa para generar analizadores léxicos (en inglés scanners o
lexers), se utiliza comúnmente con el programa yacc que se utiliza para
generar análisis sintáctico, escrito originalmente por Eric Schmidt y Mike
Lesk, es el analizador léxico estándar en los sistemas Unix, y se incluye
en el estándar de POSIX. Lex toma como entrada una especificación de
analizador léxico y devuelve como salida el codigo fuente
implementando el analizador léxico en C.
Un programa fuente de Lex tiene el siguiente aspecto:
<sección de definiciones>
<sección de reglas>
<sección de rutinas>
De estas tres secciones, sólo la segunda es obligatoria, y cualquiera de ellas puede estar
vacía.
El patrón regular debe estar situado en la primera posición de la línea.
• El patrón y la acción se separan por un blanco o un tabulador (o más).
• La acción puede ser una sola sentencia de C, o una sentencia compuesta, encerrada
entre llaves {}.
Generador FLEX
Es una herramienta para la generación de programas que realizan
concordancia de patrones en textos, es una herramienta para
generar escáneres Flex lee los archivos de entrada dados, o la
entrada estándar si no se le ha indicado ningún nombre de
archivo, con la descripción de un escáner a generar. La
descripción se encuentra en formas de parejas de expresiones
regulares y código C. denominadas reglas.
Partes de una especificación FLEX Tres partes separadas por el símbolo%
%. Las dos primeras son obligatorias, aunque pueden estar vacías
< sección de declaraciones >
%%
< sección de reglas y acciones >
%%
< sección de rutinas de usuario >