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;

}