Flex (generador de analizador léxico)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 14 de abril de 2018; las comprobaciones requieren 5 ediciones .
Flexionar
Tipo de generador de analizador léxico
Autor Vern Paxón [d] [1][2]
Desarrollador Vern Paxson [d] [1][3]
Escrito en xi
Sistema operativo similar a Unix
Primera edición 1987 [4]
plataforma de hardware software multiplataforma
ultima versión
Licencia BSD
Sitio web github.com/westes/flex

Flex (Fast Lexical Analyzer) - generador de analizadores léxicos . Reemplaza a Lex en sistemas basados ​​en paquetes GNU y tiene una funcionalidad similar. Sin embargo, Flex no es parte del Proyecto GNU [7] .

Uso

Lex es una herramienta de análisis léxico que se puede usar para extraer ciertas cadenas del texto fuente de una manera predeterminada. Yacc es una herramienta de análisis ; lee texto y se puede utilizar para convertir una secuencia de palabras en un formato estructurado para su posterior procesamiento. [ocho]

A la entrada, el programa recibe un texto en formato libre y las reglas para resaltar tokens, ya la salida da el código del analizador, en forma de función en lenguaje C. [9]

Las reglas se especifican como expresiones regulares a la izquierda y, normalmente, como código C a la derecha. Contienen tres secciones, separadas por la línea "%%":

Bloque de definición %% bloque de reglas %% bloque de código C

Las definiciones contienen valores iniciales y definiciones, reglas, las expresiones mismas y sus acciones correspondientes; el código de usuario simplemente se incluye en la salida flexible. Es posible que falten algunas secciones.

La función de analizador toma el texto como entrada y ejecuta el código dado para cada token que encuentra. Por ejemplo, este código imprimirá f ("%s", getlogin ()) para cada aparición de nombre de usuario en el texto :

%% nombre de usuario printf ( "%s" , getlogin () );

Esta función imprimirá en el flujo la cadena devuelta por la función getlogin(). Es decir, cada aparición de nombre de usuario en el flujo de entrada será reemplazada por el valor devuelto por getlogin().

Reglas según las cuales la función final debe imprimir el tipo de token (si, variable , número, operación unaria o binaria ) y valores para algunos tokens:

%% if printf ( "Instrucción IF \n " ); [ a - z ] + printf ( "etiqueta, valor %s \n " , yytext ); { D } + printf ( "número decimal %s \n " , yytext ); "++" printf ( "op unario \n " ); "+" printf ( "operación binaria \n " );

Un ejemplo de contar el número de líneas y caracteres en un texto:

% { int num_lines = 0 , num_chars = 0 ; % } %% \ n ++ núm_líneas ; ++ numero_caracteres ; . ++ numero_caracteres ; %% principal () { ylex (); printf ( "# de líneas = %d, # de caracteres = %d \n " , num_lines , num_chars ); }

La función generada por el generador para encontrar el siguiente token se puede utilizar con generadores de analizadores . En la mayoría de los casos, flex se usa con yacc o GNU bison .

Notas

  1. 1 2 https://cvsweb.openbsd.org/src/usr.bin/lex/README
  2. https://cvsweb.openbsd.org/src/usr.bin/lex/parse.y
  3. https://cvsweb.openbsd.org/src/usr.bin/lex/COPYING
  4. (título no especificado) - P. 9. - ISBN 978-0-596-15597-1
  5. Versión 2.6.4 - 2017.
  6. lex 2.6.4 publicado  (inglés) - 2017.
  7. Cameron Mackinnon. ¿Es GNU flexible o no? (enlace no disponible) (2 de diciembre de 1996). Consultado el 1 de agosto de 2010. Archivado desde el original el 29 de abril de 2012. 
  8. [ IBM. Beneficio.  (enlace no disponible) . Fecha de acceso: 18 de junio de 2010. Archivado desde el original el 22 de enero de 2009. IBM. Beneficio.  (enlace no disponible) ]
  9. Usualmente yylex().

Enlaces