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