Resumen: Semana del 21 al 28 de marzo
(1/8)
Análisis léxico con lex
- lex (así en minúsculas) es un programa generador de analizadores léxicos
- Genera código fuente (usualmente en C) que contiene una función (usualmente yylex()) que hace el análisis léxico
(2/8)
Estructura de los programas con lex
- El lenguaje lex se compone de tres secciones principales, separadas por el símbolo %%
- Declaraciones
- Reglas de traducción
- Funciones auxiliares
- Opcionalmente se pueden colocar cabeceras al inicio, encerradas entre %{ y %}
(3/8)
Estructura de los programas con lex: declaraciones
- En esta sección se colocan declaraciones, expresiones que se transforman en otras expresiones según reglas definidas
- Cada línea incluye un identificador a la izquierda, y una expresión regular a la derecha
(4/8)
Estructura de los programas con lex: expresiones regulares
- Las expresiones regulares coinciden con una o varias series específicas de caracteres
- Utilizan varios caracteres reservados:
- "elemento" significa literalmente la hilera entre las comillas
- . es cualquier caracter menos cambio de línea
- ^ significa principio de línea, $ final de línea
- [xyz] significa cualquiera de los caracteres dentro de los paréntesis cuadrados
- a* significa el elemento cero o más veces
- a+ significa el elemento una o más veces
- a{1,1000} significa el elemento una determinada cantidad de veces, en este caso de una a mil
- a|b significa un elemento o el otro
- Finalmente, (a) sirve para agrupar todos los elementos dentro de los paréntesis para aplicarles operadores
- Para usar los operadores en forma literal, se les antecede con \
(5/8)
Estructura de los programas con lex: reglas de traducción
- Las reglas de traducción indican qué comandos se deben ejecutar cuando se encuentre una expresión regular dada
- Aplica las declaraciones antes declaradas para definir las expresiones regulares
(6/8)
Estructura de los programas con lex: prioridad
- Hay casos en que una definición coincide con más de una expresión regular
- En ese caso, la que se haya definido de primera tiene prioridad
- De ahí que sea importante el orden de definición de expresiones regulares en los archivos lex
(7/8)
Estructura de los programas con lex: Funciones auxiliares
- Esta sección contiene los segmentos de programa que no son generados por lex (por ejemplo, la rutina principal)
- También al principio hay una sección similar donde se pueden escribir encabezados para el programa
(8/8)
Un ejemplo de archivo lex
%{
include <stdio.h>
}%
digit [0-9]
space [ \t\n]
letter [A-Za-z]
%%
{digit}+ {printf("Numero encontrado\n");
{letter}+ {printf("Palabra encontrada\n");
{space}+ {/*Nada*/}
%%
int main(){
f = fopen("a.txt", "r");
yy_create_buffer (f, YY_BUF_SIZE);
int n = 0;
while (n != -1){
n = yylex();
}
return 0;
}