-Pprefix
de flex cambia el prefijo por defecto yy
para todas las variables globales y funciones. Por ejemplo
-Pfoo
cambia el nombre de yytext
footext
.
También cambia el nombre del fichero de salida
de lex.yy.c
a lex.foo.c
.
Sigue la lista de identificadores afectados:
yy_create_buffer yy_delete_buffer yy_flex_debug yy_init_buffer yy_flush_buffer yy_load_buffer_state yy_switch_to_buffer yyin yyleng yylex yylineno yyout yyrestart yytext yywrapDesde dentro del analizador léxico puedes referirte a las variables globales y funciones por cualquiera de los nombres, pero externamente tienen el nombre cambiado. Esta opción nos permite enlazar diferentes programas flex en un mismo ejecutable.
Sigue un ejemplo de uso de dos analizadores léxicos dentro del mismo programa:
$ cat one.l %% one {printf("1\n"); return 1;} . {printf("First analyzer: %s\n",yytext);} %% int onewrap(void) { return 1; } $ cat two.l %% two {printf("2\n"); return 2;} . {printf("Second analyzer: %s\n",yytext);} %% int twowrap(void) { return 1; } $ cat onetwo.c main() { onelex(); twolex(); }Como hemos mencionado, la compilación flex se debe realizar con el opción
-P
,
que cambia el prefijo por defecto yy
de las funciones
y variables accesibles por el usuario.
El mismo efecto puede conseguirse utilizando la opción prefix
, escribiendo
%option prefix="one"
y %option prefix="two"
en los respectivos programas
one.l
y two.l
.
$ flex -Pone one.l $ flex -Ptwo two.l $ ls -ltr | tail -2 -rw-rw---- 1 pl casiano 36537 Nov 7 09:52 lex.one.c -rw-rw---- 1 pl casiano 36524 Nov 7 09:52 lex.two.c $ gcc onetwo.c lex.one.c lex.two.c $ a.out two First analyzer: t First analyzer: w First analyzer: o one 1 one Second analyzer: o Second analyzer: n Second analyzer: e two 2 $