GESTOS Y POSTURAS EN LA MISA PARA LOS MONAGUILLOS.pptx
Analisis lexico automatas i
1. Unidad 5
LENGUAJES Y AUTOMATAS
Análisis léxico (Scanner)
La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de
caracteres y dividirlo en tokens . Los tokens son las palabras reservadas de un lenguaje, secuencia
de caracteres que representa una unidad de información en el programa fuente. En cada caso un
token representa un cierto patrón de caracteres que el analizador léxico reconoce, o ajusta desde
el inicio de los caracteres de entrada. De tal manera es necesario generar un mecanismo
computacional que nos permita identificar el patrón de transición entre los caracteres de entrada,
generando tokens, que posteriormente serán clasificados. Este mecanismo es posible crearlo a
partir de un tipo especifico de maquina de estados llamado autómata finito.
Función del analizador léxico
Es la primera fase de un compilador. Su principal función consiste en leer la secuencia de caracteres
del programa fuente, carácter a carácter, y elaborar como salida la secuencia de componentes
léxicos que utiliza el analizador sintáctico. El analizador sintáctico emite la orden al analizador léxico
para que agrupe los caracteres y forme unidades con significado propio llamados componentes
léxicos ( tokens ). Los componentes léxicos representan:
o Palabras reservadas: if , while , do , …
o Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas, …
o Operadores: =, >, <, >= , <= , +, *, …
o Símbolos especiales: ;, ( ) , { } , …
o Constantes numéricas. literales que representan valores enteros y flotantes. o Constantes de
carácter: literales que representan cadenas de caracteres.
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.
2. Unidad 5
LENGUAJES Y AUTOMATAS
Además el analizador léxico es responsable de:
o Manejo de apertura y cierre de archivo, lectura de caracteres y gestión de posibles errores de
apertura.
o Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea.
o Inclusión de archivos y macros.
o Contabilizar número de líneas y columnas para emitir mensajes de error.
Una de las ventajas de separar el análisis léxico y análisis sintáctico es que facilita la
transportabilidad del traductor si se decide realizar cambios posteriores, por ejemplo cambiar las
etiquetas begin-end por llaves de apertura y cierre { } .
Componentes léxicos, patrones y lexemas
En la fase de análisis, los términos componentes léxicos (token ), patrón y lexema se emplean con
significados específicos. Un analizador léxico, inicialmente lee los lexemas y le asigna un significado
propio.
• componente léxico es la secuencia lógica y coherente de caracteres relativo a una categoría:
identificador, palabra reservada, literales (cadena/numérica), operador o carácter de puntuación,
además de que un componente léxico puede tener uno o varios lexemas.
• patrón es una regla que genera la secuencia de caracteres que puede representar a un
determinado componente léxico ( expresión regular ).
• lexema es una cadena de caracteres que concuerda con un patrón que describe un componente
léxico (valor de cadena).
Ejemplo de una cadena de código: const pi = 3.1416;
El analizador léxico recoge información sobre los componentes léxicos en sus atributos asociados.
Los tokens influyen en las decisiones del análisis sintáctico, y los atributos, en la traducción de los
tokens. En la practica los componentes léxicos suelen tener solo un atributo. Para efectos de
diagnostico, puede considerarse tanto el lexema para un identificador como el numero de línea en
el que se encontró por primera vez. Esta información puede ser almacenada en la tabla de símbolos
para el identificador (estructura de datos).
Para la cadena E=M*C**2 de ejemplo, los componentes léxicos y los valores de atributo asociado
son:
3. Unidad 5
LENGUAJES Y AUTOMATAS
Tome en cuenta que ciertas parejas no necesitan un valor de atributo. Los atributos relacionados
con ese token deberán ser conservados y transferidos a alguna estructura de datos para que sean
empleados en las siguientes etapas del análisis
Manejo de Buffer de entrada
Existen algunos aspectos de eficiencia relacionados con el manejo de buffer. Primero se menciona
un esquema de doble buffer de entrada que resulta útil como pre-análisis de la entrada para
identificar los componentes léxicos. El segundo esquema introduce algunas técnicas útiles para
aumentar la eficiencia del analizador léxico, empleando “centinelas”.
Hay veces en que el analizador léxico necesita analizar previamente varios caracteres, además del
lexema para un patrón, antes de poder anunciar una concordancia. Se pueden emplear muchos
esquemas de manejos de buffer , pero, aquí tan solo se señalarán algunos principios básicos.
Parejas de buffer – Se utiliza un buffer dividido en dos mitades de N (1024 ó 512) caracteres cada
una, Se leen N caracteres de entrada en cada mitad del buffer con un orden de lectura del sistema,
en vez de invocar una instrucción de lectura para cada carácter de entrada. Si quedan menos de N
caracteres en la entrada, entonces se lee un carácter especial eof en el buffer después de los
caracteres de entrada. Es decir, eof marca el final del archivo fuente y es distinto a cualquier carácter
de la entrada.
Se mantienen dos apuntadores en el buffer de entrada. La cadena de caracteres entre los dos
apuntadores es el lexema en curso. Al principio, los dos apuntadores apuntan al primer carácter del
próximo lexema que hay que encontrar. Uno de ellos, apuntador delantero, examina hacia adelante
hasta encontrar una concordancia con un patrón. Una vez determinado el siguiente lexema, el
apuntador delantero se coloca en el carácter de su extremo derecho. Después de haber procesado
4. Unidad 5
LENGUAJES Y AUTOMATAS
el lexema, ambos apuntadores se colocan en el carácter situado inmediatamente después del
lexema. Con este esquema se pueden considerar los comentarios y los espacios en blanco como
patrones que no producen componentes léxicos.
Centinela – Corrigiendo la deficiencia del método anterior para reducir la necesidad de dos pruebas
para cada avance del apuntador delantero. Se amplia cada mitad del buffer para admitir un carácter
centinela al final. De esta manera se vuelve mas eficiente el proceso de cargar del buffer, realizando
una carga en cada mitad.
El manejo de buffer es una labor puramente de programación y se recomienda realizarla de la
manera que resulte mas sencilla, no es necesario apegarse a alguno de los dos métodos antes
mencionados.
Especificaciones de componentes léxicos
Las expresiones regulares son una notación importante para especificar patrones. Cada patrón
concuerda con una serie de cadenas que, de modo que las expresiones regulares servirán como
nombres para conjuntos de cadenas. El término alfabeto denota cualquier conjunto finito de
símbolos, por ejemplo el alfabeto binario { 0, 1 }. Una cadena es una secuencia de finita de símbolos
de un alfabeto y un lenguaje se refiere a conjunto de cadenas de un alfabeto fijo.
Reconocimiento de componentes léxico
Un reconocedor de lenguajes es un programa que toma como entrada una cadena x e indica si dicha
cadena pertenece a una frase del programa. Se compila una expresión regular en un reconocedor
construyendo un diagrama de transiciones generalizado llamado autómata finito. Un autómata
finito puede ser determinista o no determinista, dependiendo del número de transiciones para un
mismo símbolo de entrada. Tanto los autómatas finitos deterministas como los no deterministas
pueden reconocer con precisión a los conjuntos regulares. Por tanto, ambos pueden reconocer con
precisión lo que denotan las expresiones regulares.