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] .
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 CLas 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 .