Cuando el escáner generado está funcionando, este analiza su entrada buscando cadenas que concuerden con cualquiera de sus patrones. Si encuentra más de un emparejamiento, toma el que empareje más texto (para reglas de contexto posterior, se incluye la longitud de la parte posterior, incluso si se devuelve a la entrada). Si encuentra dos o más emparejamientos de la misma longitud, se escoge la regla listada en primer lugar en el fichero de entrada de
flex.
Una vez que se determina el emparejamiento, el texto correspondiente al emparejamiento (denominado el token) está disponible en el puntero a caracter global
yytext, y su longitud en la variable global entera
yyleng. Entonces la acción correspondiente al patrón emparejado se ejecuta (See section
Acciones∞, para una descripción más detallada de las acciones), y entonces la entrada restante se analiza para otro emparejamiento.
Si no se encuentra un emparejamiento, entonces se ejecuta la
regla por defecto: el siguiente caracter en la entrada se considera reconocido y se copia a la salida estándar. Así, la entrada válida más simple de
flex es:
%%
que genera un escáner que simplemente copia su entrada (un caracter a la vez) a la salida.
Fíjese que
yytext se puede definir de dos maneras diferentes: bien como un
puntero a caracter o como un
array de caracteres. Usted puede controlar la definición que usa
flex incluyendo una de las directivas especiales `%pointer' o `%array' en la primera sección (definiciones) de su entrada de flex. Por defecto es `%pointer', a menos que use la opción de compatibilidad `-l', en cuyo caso
yytext será un array.
La ventaja de usar `%pointer' es un análisis substancialmente más rápido y la ausencia de desbordamiento del buffer cuando se emparejen tokens muy grandes (a menos que se agote la memoria dinámica). La desventaja es que se encuentra restringido en cómo sus acciones pueden modificar
yytext (see section
Acciones∞), y las llamadas a la función `unput()' destruyen el contenido actual de
yytext, que puede convertirse en un considerable quebradero de cabeza de portabilidad al cambiar entre diferentes versiones de
lex.
La ventaja de `%array' es que entoces puede modificar
yytext todo lo que usted quiera, las llamadas a `unput()' no destruyen
yytext (ver más abajo). Además, los programas de
lex existentes a veces acceden a
yytext externamente utilizando declaraciones de la forma:
extern char yytext[];
Esta definición es errónea cuando se utiliza `%pointer', pero correcta para `%array'.
`%array' define a
yytext como un array de
YYLMAX caracteres, que por defecto es un valor bastante grande. Usted puede cambiar el tamaño símplemente definiendo con #define a
YYLMAX con un valor diferente en la primera sección de su entrada de
flex. Como se mencionó antes, con `%pointer' yytext crece dinámicamente para acomodar tokens grandes. Aunque esto signifique que con `%pointer' su escáner puede acomodar tokens muy grandes (tales como emparejar bloques enteros de comentarios), tenga presente que cada vez que el escáner deba cambiar el tamaño de
yytext también debe reiniciar el análisis del token entero desde el principio, así que emparejar tales tokens puede resultar lento. Ahora
yytext no crece dinámicamente si una llamada a `unput()' hace que se deba devolver demasiado texto; en su lugar, se produce un error en tiempo de ejecución.
También tenga en cuenta que no puede usar `%array' en los analizadores generados como clases de C++ (see section
Generando escáneres en C++∞).