%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 missedEste 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
.