

YY_USER_ACTION permite ejecutar una acción inmediatamente después del ``emparejamiento'' y antes de la ejecución de la acción asociada.
cuando se la invoca, la variable yy_act contiene el número de la regla que ha emparejado (las reglas se numeran a partir de uno). La macro YY_NUM_RULES contiene el número de reglas, incluyendo la regla por defecto.
El siguiente programa aprovecha dichas macros para mostrar las frecuencias de uso de las reglas.
$ cat user_action.l
%array
%{
#include <string.h>
int ctrl[YY_NUM_RULES];
#undef YY_USER_ACTION
#define YY_USER_ACTION { ++ctrl[yy_act]; }
%}
number [0-9]+
id [a-zA-Z_]+[a-zA-Z0-9_]*
whites [ \t\n]+
%%
{id}
{number}
{whites}
.
%%
int yywrap() {
int i;
for(i=1;i<YY_NUM_RULES;i++)
printf("Rule %d: %d occurrences\n",i,ctrl[i]);
}
$ flex user_action.l ; gcc lex.yy.c -lfl ; a.out
a=b+2*(c-4)
Rule 1: 3 occurrences
Rule 2: 2 occurrences
Rule 3: 1 occurrences
Rule 4: 6 occurrences

