Vous êtes sur la page 1sur 6

INTRODUCCIN A FLEX Flex es una herramienta que traduce la especificacin de un analizador lxico a un programa escrito en C que lo implementa.

Para especificarlo usaremos expresiones regulares a las que se puede asociar acciones escritas en C. Cada vez que el analizador encuentra en la cadena de entrada una secuencia que encaja en una de las expresiones regulares especificadas, ejecutar la accin que le hallamos asociado. fichero.l ---> FLEX ---> lex.yy.c lex.yy.c + (ficheros .c) ---> GCC ---> ejecutable Compilacin : $flex fichero.l Compila la especificacin del analizador y crea el fichero yy.lex.c con el cdigo del autmata. $ gcc lex.yy.c -ll Enlaza con librera de Flex (proporciona yywrap() y main() por defecto) $ gcc lex.yy.c (ficheros .c) El usuario deber de proporcinar sus propias main() e yywrap(). Dentro del cdigo se deber llamar a la funcin yylex() que tratar un TOKEN por cada llamada. Funcionamiento del analizador. El fichero lex.yy.c contine las tablas de autmata generado y la funcin int yylex(void) que simula el analizador especificado y sirve de interfaz con el cdigo de usuario. (yylex() deber de ser llamada en algn punto del cdigo del usuario) En cada llamada, yylex() ir tomando caracteres de la entrada hasta que machee una de las expresiones regulares de la especificacin. Entonces, se almacenar el texto que ha macheado la expr. reg. en la variable yytext y se ejecutarn las acciones asociadas al patrn.

Las acciones podrn ser simplemente el procesamiento del texto macheado y enviarlo de nuevo a la salida.

En otras ocasiones podrn suponer la alteracin de varables del cdigo de ususario y la devolucin a la rutina que llama a yylex() de algn tipo de dato por medio de RETURN (generalmente ser un valor numrico que identifique la TOKEN encontrado).

2 .- ESTRUCTURA DE UNA ESPECIFICACIN 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>

Seccin de Declaraciones.

En esta seccin se puede incluir :

- Cdigo C necesario para las acciones.

Se incluye cdigo C necesario para las acciones asociadas a los patrones. El cdigo C se incluir entre los smbolos %{ y %}, y ser copiado tal cual al fichero lex.yy.c. (Generalmente sern #includes y/o estructuras y variables del cdigo de usuario que se vean afectadas por las acciones)

- Definicin de macros.

Se definen "alias" asociados a expresiones regulares que se usarn el la seccin de reglas.

Ej. : LETRA_MAYUSCULA [A-Z] (En la seccin de reglas se referenciar entre llaves como {LETRA_MAYUSCULA})

- Definicin de entornos de reconocimiento (start conditions) Se definen entornos dentro de los cuales se podrn reconocer sub-expresiones. Permite especificar entornos dentro de los cuales se machearn sub-expresiones dependiendo del contexto. (Permite generar mini-analizadores dentro del analizador)

Ej.: (1ra. Conjugacion en espaol) (en declaracin) ... %% (en reglas) cant {BEGIN V1C;} /* Comienza el entorno V1C */ %start V1C

... <V1C>o {printf("1ra. Persona presente indicativo");} <V1C>as {printf("2da. Persona presente indicativo");} <V1C>a {printf("3ra. Persona presente indicativo");} ...

Seccin de reglas.

Esta seccin tiene el siguiente formato:

(exp reg 1 ) (accin 1 ) .... .... (exp reg n ) (accin n )

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

NOTA: El primer carcter de la expresin regular debe de comenzar en la primera columna de texto. (de lo contrario se considerara un trozo de cdigo C)

Cuando la accin involucra varias sentencias C es necesario encerrarlas entre llaves.

Cuando varias expresiones regulares comparten la misma accin se utilizar el smbolo | . Este smbolo indica que se debe tomar como accin para esta regla la misma que se especifique para la siguiente expresin regular.

Ej.:

exp reg1 | exp reg2 | ... ... exp regN accin comn

Si no se especifica ninguna accin se terminar la regla con punto y coma ";". En este caso se considera como una accin vaca y por defecto se copiar directamente el string macheado en la salida.

Ambigedades.

En el caso de que una misma cadena pueda corresponderse con ms de una especificacin se elegir la expresin que machee el mayor nmero de caracteres. Si el nmero es el mismo se elige a la que aparezca primero en la especificacin.

Seccin de rutinas de usuario

Esta seccin zona se puede escribir cdigo C adicional, bien funciones llamadas desde las acciones de las reglas o, en el caso de programas pequeos, suelen incluirse las funciones main() y yywrap() propias del usuario. 3.- VARIABLES PREDEFINIDAS POR FLEX

Flex define varias variables estndar que le sirven de interface.

yytext ---> Puntero a una cadena de caracteres que contiene la ltima cadena de texto que encaj con una expresin regular.

Est declarada como char *yytext (puede modificarse pero no es aconsejable) Su contenido slo es estable dentro de las reglas y entre llamadas consecutivas a la funcin yylex().

yyleng ---> Contiene la longitud de la cadena yytext. Tampoco se debe modificar. yyin ---> Variable declarada de tipo FILE *. Contiene un puntero al fichero del que lee caracteres el reconocedor.

Por defecto se corresponde con la entrada estndar. Ser necesario cambiarla para que el analizador lea de un fichero distinto.

yyout ---> Variable declarada del tipo FILE *. Contiene un puntero al fichero estndar en el que escribe el analizador lxico al utilizar la accin ECHO. Se puede cambiar libremente

Vous aimerez peut-être aussi