Inicio / Wikis / Tutoriales / Flex, versión 2.5 - El escaner generado

Flex, versión 2.5 - El escaner generado

(2 opiniones)
Tutorial creado por Vern Paxson. Extraido de: http://es.tldp.org/Manuales-LuCAS/FLEX/flex-es-2.5.html#SEC25
14 de Febrero de 2006
Herramientas de gestión de contenidos

8 - El escaner generado

La salida de flex es el fichero `lex.yy.c', que contiene la rutina de análisis `yylex()', un número de tablas usadas por esta para emparejar tokens, y un número de rutinas auxiliares y macros. Por defecto, `yylex()' se declara así

int yylex()
{
... aquí van varias definiciones y las acciones ...
}

(Si su entorno acepta prototipos de funciones, entonces este será "int yylex( void )"). Esta definición podría modificarse definiendo la macro "YY_DECL". Por ejemplo, podría utilizar:

#define YY_DECL float lexscan( a, b ) float a, b;

para darle a la rutina de análisis el nombre lexscan, que devuelve un real, y toma dos reales como argumentos. Fíjese que si pone argumentos a la rutina de análisis usando una declaración de función no-prototipada/tipo-K&R, debe hacer terminar la definición con un punto y coma (`;').

Siempre que se llame a `yylex()', este analiza tokens desde el fichero de entrada global yyin (que por defecto es igual a stdin). La función continúa hasta que alcance el final del fichero (punto en el que devuelve el valor 0) o una de sus acciones ejecute una sentencia return.

Si el escáner alcanza un fin-de-fichero, entonces el comportamiento en las llamadas posteriores está indefinido a menos que o bien yyin apunte a un nuevo fichero de entrada (en cuyo caso el análisis continúa a partir de ese fichero), o se llame a `yyrestart()'. `yyrestart()' toma un argumento, un puntero `FILE *' (que puede ser nulo, si ha preparado a YY_INPUT para que analice una fuente distinta a yyin), e inicializa yyin para que escanee ese fichero. Esencialmente no hay diferencia entre la asignación a yyin de un nuevo fichero de entrada o el uso de `yyrestart()' para hacerlo; esto último está disponible por compatibilidad con versiones anteriores de flex, y porque puede utilizarse para conmutar ficheros de entrada en medio del análisis. También se puede utilizar para desechar el buffer de entrada actual, invocándola con un argumento igual a yyin; pero mejor es usar YY_FLUSH_BUFFER (see section Acciones). Fíjese que `yyrestart()' no reinicializa la condición de arranque a INITIAL (see section Condiciones de arranque).

Si `yylex()' para el análisis debido a la ejecución de una sentencia return en una de las acciones, el analizador podría ser llamado de nuevo y este reanudaría el análisis donde lo dejó.

Por defecto (y por razones de eficiencia), el analizador usa lecturas por bloques en lugar de simples llamadas a `getc()' para leer caracteres desde yyin. La manera en la que toma su entrada se puede controlar definienfo la macro YY_INPUT. La secuencia de llamada para YY_INPUT es "YY_INPUT(buf,result,max_size)". Su acción es poner hasta max_size caracteres en el array de caracteres buf y devolver en la variable entera result bien o el número de caracteres leídos o la constante YY_NULL (0 en sistemas Unix) para indicar EOF. Por defecto YY_INPUT lee desde la variable global puntero a fichero "yyin".

Una definición de ejemplo para YY_INPUT (en la sección de definiciones del fichero de entrada) es:

%{
#define YY_INPUT(buf,result,max_size) \
{ \
int c = getchar(); \
result = (c
EOF) ? YY_NULL : (buf[0] = c, 1); \ }
%}

Esta definición cambiará el procesamiento de la entrada para que suceda un caracter a la vez.

Cuando el analizador reciba una indicación de fin-de-fichero desde YY_INPUT, entonces esta comprueba la función `yywrap()'. Si `yywrap()' devuelve falso (cero), entonces se asume que la función ha ido más allá y ha preparado yyin para que apunte a otro fichero de entrada, y el análisis continúa. Si este retorna verdadero (no-cero), entonces el analizador termina, devolviendo un 0 a su invocador. Fíjese que en cualquier caso, la condición de arranque permanece sin cambios; esta no vuelve a ser INITIAL.

Si no proporciona su propia versión de `yywrap()', entonces debe bien o usar `%option noyywrap' (en cuyo caso el analizador se comporta como si `yywrap()' devolviera un 1), o debe enlazar con `-lfl' para obtener la versión por defecto de la rutina, que siempre devuelve un 1.

Hay disponibles tres rutinas para analizar desde buffers de memoria en lugar de desde ficheros: `yy_scan_string()', `yy_scan_bytes()', e `yy_scan_buffer()'. Las trataremos en la section Múltiples buffers de entrada. El analizador escribe su salida con `ECHO' a la variable global yyout (por defecto, stdout), que el usuario podría redefinir asignándole cualquier otro puntero a FILE.
Valora este capítulo: (2 opiniones)
Autor y licencia de 'Flex, versión 2.5 - El escaner generado'
Vern Paxson Extraído de: http://es.tldp.org/Manuales-LuCAS/FLEX/flex-es-2.5.html#SEC25 GNU Free Documentation License
Licencia GNU Free Documentation License: http://www.es.gnu.org/licencias/fdles.html
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Opiniona sobre 'Flex, versión 2.5 - El escaner generado' (2)

Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.

Opina sobre este tutorial



* Valoración:
* Nombre:
* Correo electrónico:
* Título:
* Comentario:

Wikis relacionados con 'Flex, versión 2.5 - El escaner generado'

El desarrollo del nuevo modelo económico, ha generado cambios en todos los aspectos de las... Más »
Por la eficacia de las empresas, y también para nutrir los presupuestos de las áreas... Más »
Por la eficacia de las empresas, y también para nutrir los presupuestos de las áreas... Más »
Este documento contiene una lista de las aplicaciones para Linux capaces de reproducir diversos formatos... Más »
A lo largo de este trabajo se va a intentar hacer un repaso de los... Más »
¿Estás seguro de que deseas eliminar este capítulo?