

%pointer o %array. Estas directivas hacen que yytext
se declare como un puntero o un array respectivamente.
La opción por defecto es declararlo como un puntero, salvo que se haya
usado la opción -l en la línea de comandos, para garantizar una
mayor compatibilidad con LEX.
Sin embargo, y aunque la opción %pointer es la mas eficiente
(el análisis es mas rápido y se evitan los buffer overflow),
limita la posible manipulación de yytext y de las llamadas
a unput().
$ cat yytextp.l
%%
hello {
strcat(yytext, " world");
printf("\n%d: %s\n",strlen(yytext),yytext);
}
$ flex yytextp.l ; gcc lex.yy.c -lfl ; a.out
hello
11: hello world
fatal flex scanner internal error--end of buffer missed
Este error no aparece si se utiliza la opción %array:
$ cat yytext.l
%array
%%
hello {
strcat(yytext, " world");
printf("\n%d: %s\n",strlen(yytext),yytext);
}
$ flex yytext.l; gcc lex.yy.c -lfl; a.out
hello
11: hello world
Además, algunos programs LEX modifican directamente yytext, utilizando la declaración:
extern char yytext[]
que es incompatible con la directiva %pointer (pero correcta con %array).
La directiva %array define yytext como un array de tamaño YYLMAX.
Si deseamos trabajar con un mayor tamaño, basta con redefinir YYLMAX.

