Vous êtes sur la page 1sur 13

Generador de analizadores lxicos FLEX

Procesadores de Lenguajes 4o Informtica PL curso 2008-2009 (CCIA)


CCIA

Octubre 2008

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

1 / 12

Uso de FLEX
FLEX: traduce la especicacin de un analizador lxico a un programa C que lo implementa
Analizador lxico descrito/especicado mediante expresiones regulares (E.R.) A las E.R. se les pueden asociar acciones (cdigo C) Cada vez que el analizador encuentra una secuencia que encaja con una de las E.R., ejecutar la accin asociada
fichero.l FLEX lex.yy.c

lex.yy.c + (ficheros .c)

GCC

ejecutable

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

2 / 12

Pasos de compilacin
1

Compilar la especicacin del analizador y crear el chero yy.lex.c con el cdigo del autmata $ flex fichero.l Compilar el analizador C y generar el programa ejecutable
1

Enlazar con librera de FLEX (proporciona implemenatciones por defecto para yywrap() y main()) $ gcc lex.yy.c -lfl Compilar y enlazar con cheros .c del usuario $ gcc lex.yy.c (ficheros .c)
Usuario proporciona implementaciones para main() e yywrap() Deber llamar a la funcin yylex() que reconocer un TOKEN por cada llamada.

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

3 / 12

Funcionamiento de FLEX
tablas del autmata generado funcin int yylex(void) yylex() simula el analizador especicado y sirve de interfaz con el cdigo de usuario lex.yy.c contiene
yylex() debe de ser llamada desde el cdigo de usuario

Funcionamiento: En cada llamada, yylex():


1 2 3

toma caracteres de la entrada hasta que machea una E.R. el texto que macheado se almacena en la variable yytext se ejecutan las acciones asociadas al patrn de esa E.R. Puede ser simplemente el procesamiento del texto macheado para enviarlo de nuevo a la salida. En otras ocasiones podrn suponer la alteracin de variables del cdigo de ususario y la devolucin a la rutina que llama a yylex() (mediante return) de un valor numrico que identique al TOKEN reconocido

Acciones:

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

4 / 12

Partes de una especicacin FLEX


Tres partes separadas por el smbolo % % Las dos primeras son obligatorias, aunque pueden estar vacas < seccin de declaraciones > %%

< seccin de reglas y acciones > %% < seccin de rutinas de usuario >

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

5 / 12

Seccin de declaraciones
Cdigo C necesario para las acciones asociadas a los patrones
El cdigo C ir entre % y %, ser copiado tal cual a lex.yy.c Generalmente sern #include, #define y estructuras o variables del cdigo de usuario afectadas por las acciones

Denicin de macros
Asocia un alias a expr. regulares usadas en la seccin de reglas (mejoran la legibilidad) En las reglas se referencia ese alias ponindolo entre llaves
denicin: uso (en reglas ): LETRA_MAYUSCULA [A-Z] DIGITO [0-9] {LETRA_MAYUSCULA} {DIGITO}

Denicin de entornos de reconocimiento (start conditions)


Entornos dentro de los cuales se podrn reconocer sub-expresiones dependiendo del contexto Permite generar mini-analizadores dentro del analizador
denicin: uso: (en reglas)

%start NOMBRE [patron] {BEGIN(NOMBRE)} /*inicio entorno*/ <NOMBRE>[sub-patron] {[accion]} <NOMBRE>[sub-patron] {BEGIN(INITIAL)} /*fin entorno*
Introduccin a FLEX Octubre-2008 6 / 12

PL0809 (CCIA)

Seccin de reglas
[exp. reg. 1] [accin 1]

Formato: ....
[exp. reg. n] [accin n]

Cada par ([exp. reg.], [accin]) recibe el nombre de regla


Si la accin involucra varias sentencias C, irn entre llaves ({...}) Si varias expr. reg. comparten la misma accin se indica con |
exp_reg1 | exp_reg2 | . . . exp_regN accin_comn Notas:

El primer carcter de la expr. reg. debe de comenzar en la primera columna de texto Si no se especica ninguna accin, se aplica la accin por defecto (se copia el string macheado en la salida)

Manejo de ambigedades
Si la entrada machea ms de 1 expr. reg. se elegir la expresin que machee mayor nm. caracteres Si nm. caracteres macheados es el mismo, se elige a la que aparezca primero en el chero FLEX
PL0809 (CCIA) Introduccin a FLEX Octubre-2008 7 / 12

Seccin de rutinas de usuario


En esta seccin se puede escribir cdigo C adicional Funciones llamadas desde las acciones de las reglas En programas sencillo se suele incluir en esta seccin las funciones main() y yywrap() denidas por el usuario Nota: La funcin int yywrap() se ejecuta cada vez que se alcanza el nal del chero de entrada Permite manejar mltiples cheros de entrada Devuelve 1 para indicar que no quedan cheros de entrada por procesar y que el procesamiento ha terminado Implementacin por defecto
int yywrap() { return(1); }

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

8 / 12

Expresiones regulares en FLEX (I)

Expresiones simples c reconoce el carcter c . cualquier carcter excepto salto de linea (\n) [abc] cualquier carcter del conjunto (a, b c) [abc] cualquier carcter excepto los del conjunto [a-z] cualquier carcter del rango indicado [a-z] cualquier carcter excepto los del rango "xxxx" reconoce la cadena indicada de forma literal {ALIAS} expande la expr. reg. asociada al alias indicado (denido en sec. declaraciones)

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

9 / 12

Expresiones regulares en FLEX (II)


Operadores (de mayor a menor precedencia) R* R+ R? R {n} R {n,m} (R ) RS R |S R R$ reconoce 0 ms repeticiones de R reconoce 1 ms repeticiones de R reconoce 0 1 ocurrencia de R (opcional) reconoce n repeticiones exactas de R reconoce de n a m repeticiones de R agrupa expresiones regulares reconoce la concatenacin de R y S reconoce o R o S reconoce la expr. R si est al inicio de linea reconoce la expr. R si est al nal de linea

Siendo R y S expr. regulares

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

10 / 12

Expresiones regulares en FLEX (III)


R /S <AAA> reconoce R slo si lo que sigue a continuacin encaja con S (S dene el contexto donde reconocer R ) reconoce la condicin de arranque AAA (normalmente la
accin asociada ser { BEGIN(AAA) } para indicar a FLEX que entre en el contexto de esa cond. de arranque)

<AAA>R

reconoce R si se est dentro del contexto de la condicin de arranque AAA

Algunos smbolos de escape: \n salto de lnea \t tabulador \\ barra invertida \+, \, \ , \$ \[, \], \(, \), \{, \}

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

11 / 12

Variables y funciones predenidas


Variables FLEX accesibles desde el cdigo de usuario yytext: Puntero a una cadena de caracteres que contiene la ltima cadena de texto que encaj con una expr. reg.
Est declarada como char *yytext Permite acceder a la cadena reconocida Su contenido slo es estable dentro de las reglas y entre llamadas consecutivas a la funcin yylex()

yyleng: Entero con la longitud de la cadena yytext yyin: Variable de tipo FILE * con un puntero al descritor del chero de donde se leen los caracteres
Por defecto se corresponde con la entrada estndar Para que el analizador FLEX lea de un chero distinto es necesario modicarla haciendo una llamada a fopen(...)

yyout: Variable de tipo FILE * con un puntero al chero en el que escribe el analizador lxico al utilizar la accin ECHO
Por defecto se corresponde con la salida estndar
PL0809 (CCIA) Introduccin a FLEX Octubre-2008 12 / 12

Acciones predenidas ECHO: Escribe en yyout el contenido de yytext BEGIN(...): Indica la entrada en una condicin de arranque ( mini-analizador)
BEGIN(INITIAL) retorna al amanizador principal

REJECT: Rechaza el macheo actual asignado a yytext y pasa a la siguiente regla que encaje (si la hay) unput(), input(): Modican los caracteres de entrada fuera del control del analizador FLEX

PL0809 (CCIA)

Introduccin a FLEX

Octubre-2008

12 / 12

Vous aimerez peut-être aussi