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


Declaración de yylex()

Por defecto la función yylex() que realiza el análisis léxico es declarada como int yylex(). Es posible cambiar la declaración por defecto utilizando la macro YY_DECL. En el siguiente ejemplo la definición:
#define YY_DECL char *scanner(int *numcount, int *idcount)
hace que la rutina de análisis léxico pase a llamarse scanner y tenga dos parametros de entrada, retornando un valor de tipo char *.
$ cat decl.l
%{
#define YY_DECL char *scanner(int *numcount, int *idcount)
%}
 
num [0-9]+
id [a-z]+
%%
{num} {(*numcount)++;}
halt  {return ((char *) strdup(yytext));}
{id}  {(*idcount)++;}
%%
main() {
  int a,b;
  char *t;
 
  a = 0; b = 0;
  t = scanner(&a, &b);
  printf("numcount = %d, idcount = %d, yytext = %s\n",a,b,t);
  t = scanner(&a, &b);
  printf("numcount = %d, idcount = %d, yytext = %s\n",a,b,t);
}
 
int yywrap() {
  return 1;
}
La ejecución del programa anterior produce la siguiente salida:
$ decl
a b 1 2 3 halt
     numcount = 3, idcount = 2, yytext = halt
 
e 4 5 f
 
numcount = 5, idcount = 4, yytext = (null)
$ decl
a b 1 2 3 halt
     numcount = 3, idcount = 2, yytext = halt
 
e 4 f 5 halt
    numcount = 5, idcount = 4, yytext = halt


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