next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Declaración de yylex() Sup: Expresiones Regulares en Flex Ant: Suprimir Err: Si hallas una errata ...


Declaración de yytext

En la sección de definiciones es posible utilizar las directivas %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.


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Declaración de yylex() Sup: Expresiones Regulares en Flex Ant: Suprimir Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22