Problema: dado un archivo de texto como entrada, la tarea es contar la frecuencia de una palabra dada en el archivo.
Explicación:
Lex es un programa de computadora que genera analizadores léxicos y fue escrito por Mike Lesk y Eric Schmidt. Lex lee un flujo de entrada que especifica el analizador léxico y genera el código fuente que implementa el lexer en el lenguaje de programación C.
Enfoque:
como sabemos, yytext contiene el valor del token coincidente actual, podemos compararlo con la palabra cuya frecuencia se va a contar. si el valor de yytext y la palabra dada son iguales, incremente la variable de conteo.
Archivo de entrada: input.txt
A continuación se muestra la implementación del enfoque anterior:
C
/* LEX code to count the frequency of the given word in a file */ /* Definition section */ /* variable word indicates the word whose frequency is to be count */ /* variable count is used to store the frequency of the given word */ %{ #include<stdio.h> #include<string.h> char word [] = "geeks"; int count = 0; %} /* Rule Section */ /* Rule 1 compares the matched token with the word to count and increments the count variable on successful match */ /* Rule 2 matches everything other than string (consists of alphabets only ) and do nothing */ %% [a-zA-Z]+ { if(strcmp(yytext, word)==0) count++; } . ; %% int yywrap() { return 1; } /* code section */ int main() { extern FILE *yyin, *yyout; /* open the input file in read mode */ yyin=fopen("input.txt", "r"); yylex(); printf("%d", count); }
Producción: