Flex (Generador de analizador léxico rápido)

FLEX (generador de analizador léxico rápido) es una herramienta/programa de computadora para generar analizadores léxicos (escáneres o lexers) escrito por Vern Paxson en C alrededor de 1987. Se usa junto con el generador de analizador Berkeley Yacc o el generador de analizador GNU Bison . Flex y Bison son más flexibles que Lex y Yacc y producen código más rápido. 
Bison produce un analizador a partir del archivo de entrada proporcionado por el usuario. La función yylex() es generada automáticamente por el flex cuando se le proporciona un archivo .l y el analizador espera que esta función yylex() llame para recuperar tokens del flujo de tokens actual/este. 

Nota: La función yylex() es la principal función flexible que ejecuta la Sección de reglas y la extensión (.l) es la extensión utilizada para guardar los programas.

Instalación de Flex en Ubuntu: 

sudo apt-get update
sudo apt-get install flex

Nota: Si el comando Actualizar no se ejecuta en la máquina durante un tiempo, es mejor ejecutarlo primero para que se instale una versión más nueva, ya que es posible que una versión anterior no funcione con los otros paquetes instalados o que no esté presente ahora.

La imagen dada describe cómo se usa el Flex:  

Paso 1: un archivo de entrada describe el analizador léxico que se generará llamado lex.l está escrito en lenguaje lex. El compilador lex transforma lex.l en programa C, en un archivo que siempre se llama lex.yy.c. 
Paso 2: El compilador de C compila el archivo lex.yy.c en un archivo ejecutable llamado a.out. 
Paso 3: El archivo de salida a.out toma un flujo de caracteres de entrada y produce un flujo de tokens. 

Estructura del programa: 

En el archivo de entrada, hay 3 secciones: 

1. Sección de definición: La sección de definición contiene la declaración de variables, definiciones regulares, constantes manifiestas. En la sección de definición, el texto está encerrado entre corchetes “%{ %}” . Todo lo escrito entre corchetes se copia directamente al archivo lex.yy.c

Sintaxis: 

%{
   // Definitions
%}

2. Sección de Reglas: La sección de reglas contiene una serie de reglas en la forma: acción de patrón y el patrón debe ser no intencionado y la acción debe comenzar en la misma línea entre corchetes {}. La sección de la regla está encerrada entre “%% %%”

Sintaxis:  

%%
pattern  action
%%

Ejemplos: La siguiente tabla muestra algunas de las coincidencias de patrones.  

Patrón Puede coincidir con
[0-9] todos los dígitos entre 0 y 9
[0+9] ya sea 0, + o 9
[0, 9] ya sea 0, ‘, ‘ o 9
[0 9] 0, ‘ ‘ o 9
[-09] ya sea -, 0 o 9
[-0-9] ya sea – o todos los dígitos entre 0 y 9
[0-9]+ uno o más dígitos entre 0 y 9
[^a] todos los demás personajes excepto un
[^AZ] todos los demás caracteres excepto las letras mayúsculas
un{2, 4} ya sea aa, aaa o aaaa
un{2, } dos o más ocurrencias de un
un{4} exactamente 4 a es decir, aaaa
. cualquier carácter excepto nueva línea
a* 0 o más ocurrencias de un
un+ 1 o más ocurrencias de un
[Arizona] todas las letras minúsculas
[a-zA-Z] cualquier letra alfabética
w(x | y)z wxz o wyz

3. Sección de código de usuario: esta sección contiene sentencias C y funciones adicionales. También podemos compilar estas funciones por separado y cargarlas con el analizador léxico.

Estructura básica del programa:  

%{
// Definitions
%}

%%
Rules
%%

User code section

Cómo ejecutar el programa: 
Para ejecutar el programa, primero se debe guardar con la extensión .l o .lex . Ejecute los siguientes comandos en la terminal para ejecutar el archivo del programa. 

Paso 1: lex filename.l o lex filename.lex, según la extensión, el archivo se guarda con 
Paso 2: gcc lex.yy.c 
Paso 3: ./a.out 
Paso 4: Proporcione la entrada al programa en caso de que sea necesario

Nota: Presione Ctrl+D o use alguna regla para dejar de tomar entradas del usuario. Consulte las imágenes de salida de los programas a continuación para aclarar si tiene dudas para ejecutar los programas.

Ejemplo 1: contar el número de caracteres en una string  

C

/*** Definition Section has one variable
which can be accessed inside yylex() 
and main() ***/
%{
int count = 0;
%}
  
/*** Rule Section has three rules, first rule 
matches with capital letters, second rule
matches with any character except newline and 
third rule does not take input after the enter***/
%%
[A-Z] {printf("%s capital letter\n", yytext);
       count++;}
.     {printf("%s not a capital letter\n", yytext);}
\n    {return 0;}
%%
  
/*** Code Section prints the number of
capital letter present in the given input***/
int yywrap(){}
int main(){
  
// Explanation:
// yywrap() - wraps the above rule section
/* yyin - takes the file pointer 
          which contains the input*/
/* yylex() - this is the main flex function
          which runs the Rule Section*/
// yytext is the text in the buffer
  
// Uncomment the lines below 
// to take input from file
// FILE *fp;
// char filename[50];
// printf("Enter the filename: \n");
// scanf("%s",filename);
// fp = fopen(filename,"r");
// yyin = fp;
  
yylex();
printf("\nNumber of Capital letters " 
      "in the given input - %d\n", count);
  
return 0;
}

Producción: 

Ejemplo 2: cuente la cantidad de caracteres y la cantidad de líneas en la entrada  

C

/* Declaring two counters one for number 
of lines other for number of characters */
%{
int no_of_lines = 0;
int no_of_chars = 0;
%}
  
/***rule 1 counts the number of lines, 
rule 2 counts the number of characters 
and rule 3 specifies when to stop 
taking input***/
%%
\n      ++no_of_lines;
.       ++no_of_chars;
end     return 0;
%%
  
/*** User code section***/
int yywrap(){}
int main(int argc, char **argv)
{
  
yylex();
printf("number of lines = %d, number of chars = %d\n",
       no_of_lines, no_of_chars );
  
return 0;
}

Producción: 

Publicación traducida automáticamente

Artículo escrito por shivani.mittal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *