El analizador léxico lee caracteres de entrada y los agrupa en tokens como palabras reservadas, identificadores y literales que luego pasa al analizador sintáctico. Funciona bajo petición del analizador sintáctico devolviendo tokens mediante expresiones regulares y autómatas finitos deterministas y no deterministas.
2. ¿Qué es?
El analizador lexico es una herramienta de
un compilador que nos ayuda a leer los
caracteres de entrada para formar
componentes y asi poder identificarlos y
pasar la informacion a analizado sintáctico.
3. ANÁLISIS LÉXICO EN PYTHON
En lugar de tratar de procesar un flujo de texto
directamente, a menudo es más sencillo — y rápido —
desglosar la entrada de texto en una serie de “tokens”,
que deberían incluir palabras reservadas, literales,
operadores y/o identificadores. Estos tokens pueden
inspeccionarse por el procesador de forma más
eficiente que un flujo de texto plano. El proceso de
transformar la entra de texto en tokens se conoce como
“análisis léxico”, “tokenizado” (“tokenizing”) o,
simplemente, “escaneo” (“scanning”).
4. El punto de entrada del analizador léxico es la
unción PyTokenizer_Get en Parser/tokenizer.c.
Esta función se llama repetidamente desde la
función principal de procesado,
parsetok en Parser/parsetok.c, que a su vez se
utiliza por alguna de las distintas funciones de
proceso de más alto nivel.
7. ¿Cuál es su función?
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:
8. Palabras reservadas: if, while, do, …
Identificadores: variables, funciones, tipos
definidos por el usuario, etiquetas, …
Operadores: =, >, <, >=, <=, +, *, …
Símbolos especiales: ;, ( ), { }, …
Constantes numéricas: literales que
representan valores enteros y flotantes.
Constantes de carácter: literales que
representan cadenas de caracteres.
9. 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.
10. Además el analizador léxico es
responsable de:
Manejo de apertura y cierre de archivo,
lectura de caracteres y gestión de posibles
errores de apertura.
Eliminar comentarios, espacios en blanco,
tabuladores y saltos de línea.
Inclusión de archivos y macros.
Contabilizar número de líneas y columnas
para emitir mensajes de error.
11. 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.
12. Componente léxico (token) 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.
Ejemplo :
• Identificadores
• Enteros
• Palabras reservadas
• Espacios en blanco
• Parentesis.
13. 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).
Atributos el análisis léxico debe
proporcionar información adicional sobre
los tokens en sus atributos asociados. El
número de atributos depende de cada
token.
14. 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”.
15. 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.
Parejas de Buffer
16. El origen de las expresiones regulares surge
de la teoría de autómatas y la teoría de
lenguajes formales, ambas parte de la
ciencias computacionales teórica. Este
campo estudia los modelos computacionales
(autómata) y la manera de describir y
clasificar los lenguajes formales. Un lenguaje
formal puede ser especificado de varias
maneras, tales como:
EXPRESIONES REGULARES
17. Cadenas producidas por alguna gramática
formal.
Cadenas producidas por expresiones
regulares.
Cadenas aceptadas por algunos
autómatas tales como las máquinas de
Turing o autómatas de estado finito.
A las expresiones regulares frecuentemente
se les llaman patrones, ya que son
expresiones que describen a un conjunto de
cadenas.
18. Una expresión regular denota un conjunto de
secuencias de símbolos válidas que se
construyen en base al alfabeto de un
lenguaje. Generalmente estos conjuntos se
representan como:
19. Es una expresión regular que denota el
conjunto vacío (el conjunto no contiene
secuencias de símbolos).
20. Es una expresión regular que denota al
conjunto que contiene la secuencia vacía.
21. AUTÓMATAS FINITOS
Una maquina de estado finito o autómata
finito, es un modelo computacional que
consiste de un conjunto de estados, un estado
de inicio, un alfabeto de entrada y una función
de transición que traza un mapa a un siguiente
estado, a partir del símbolo de entrada y el
estado actual.
22. Los autómatas finitos se pueden utilizar para
describir el proceso de reconocimiento de
patrones en cadenas de entrada. El sistema
recibe una cadena constituida por símbolos
de un alfabeto y determina si esa cadena
pertenece al lenguaje que ese autómata
reconoce.
De esta manera se pueden construir
analizadores léxicos, construyendo programas
de computadora que realicen las operaciones
de un autómata.
23. AUTÓMATA FINITO
NO DETERMINÍSTICO
Un autómata finito no determinista
(abreviado AFND) es un autómata finito que,
a diferencia de los autómatas finitos
deterministas (AFD), posee al menos un
estado q ∈ Q, tal que para un símbolo a ∈ Σ
del alfabeto, existe más de una transición
δ(q,a) posible.
24. AUTÓMATA FINITO
DETERMINÍSTICO
Un autómata finito determinista (DFA por
sus siglas en ingles), es un modelo donde el
siguiente estado de la transición esta dado
particularmente por el estado actual y el
carácter de entrada actual. Si ningún estado
de transición es especificado, la cadena
entrante es rechazada.
25. La siguiente definición formalmente
introduce un DFA, ( S, Σ, T, s, A ) donde:
S conjunto finito no vacío de elementos
llamado estados
Σ alfabeto de entrada
T es una función de transición de S × Σ en S
s∈S estado inicial
A ⊆ S conjunto no vacío de estados finales