lunes, 13 de enero de 2014

Implementación en FLEX


Para obtener los tokens que posteriormente seran utilizados por Bison vamos a utilizar FLEX.
Formato del archivo fo.flex
         declaracion        -->        token+expresiones_regulares
         %%                            %%
         reglas             -->        token+accion
         %%                            %%
         funciones          -->        main

En la sección de "reglas" tenemos que tener mucho cuidado en la declaración de las reglas.Flex va leyendo nuestro programa y cuando encuentra un entrada que concuerda con una o más reglas declaras, elige la primera regla que se declaró en la sección de reglas de FLEX.
Ejemplo :

IDENTIFICADOR {LETRA}({LETRA_O_DIGITO})*
ENTERO [eE][nN][tT][Ee][Rr][Oo]
%%
{IDENTIFICADOR} {printf( "( id : %s, )\n", yytext );}
{ASIGNACION} {printf( "( asig : %s, )\n", yytext );}
{ENTERO} {printf( "(tipo_basico : %s, )\n", yytext );}

Introducimos por linea de comando tras ejecutar el archivo "fo.flex".
> ENTERO

Flex encuentras que tanto la primera como la tercera, son validas .Pero expande la primera regla ya que esta declara antes que la tercera.
"ENTERO" es una palabra reservada por lo que no puede ser reconocida como un identificador.

Solución : intercambiar regla 3ª por la 1ª

IDENTIFICADOR {LETRA}({LETRA_O_DIGITO})*
ENTERO [eE][nN][tT][Ee][Rr][Oo]
%%
{ENTERO} {printf( "(%s, )\n", yytext );}
{IDENTIFICADOR} {printf( "(%s, )\n", yytext );}
{ASIGNACION} {printf( "(%s, )\n", yytext );}

Por ultimo , declarar los tokens y  reglas al comienzo de cada linea , no dejar ningún espacio en blanco anterior a su declaración. 

Compilación y Ejecución (fo.flex)
   > flex fo.flex
   > gcc lex.yy.c -lfl
   > /a.out

Descargar el fichero de ejemplo de flex .Pincha aqui

No hay comentarios:

Publicar un comentario