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