В моем lex-коде возникла проблема: вывод не генерируется при чтении входного файла.
Вопрос в том, чтобы написать программу lex для сканирования и подсчета количества символов, слов, цифр, гласных, согласных, специальных символов и строк в файле.
Я написал код. Я также пытался запросить в чат-gpt возможные ошибки или проблемы, но мне все равно не удалось получить письменный ответ.
Вот код.
%{
#include<stdio.h>
int lines = 0;
int vowels = 0;
int consonants = 0;
int characters = 0;
int digits = 0;
int words = 0;
int special_char = 0;
%}
%%
[a-zA-Z] {
characters++;
if (strchr("aeiouAEIOU", yytext[0]))
vowels++;
else
consonants++;
}
[0-9] {
characters++;
digits++;
}
[ \t\n] {
characters++;
if (yytext[0] == '\n')
lines++;
}
. {
characters++;
special_char++;
}
%%
int yywrap(){ return 1; }
int main(int argc, char* argv[]) {
FILE* input_file = fopen("input.txt", "r");
if (!input_file) {
printf("Error opening the file.\n");
return 1;
}
char buffer[100];
printf("Input text from the file:\n");
while (fgets(buffer, sizeof(buffer), input_file) != NULL) {
printf("%s", buffer);
}
printf("\n");
yyin = input_file;
yylex();
printf("Character count: %d\n", characters);
printf("Word count: %d\n", words); // Add this line to print the word count.
printf("Digit count: %d\n", digits);
printf("Vowel count: %d\n", vowels);
printf("Consonant count: %d\n", consonants);
printf("Special character count: %d\n", special_char);
printf("Line count: %d\n", lines);
fclose(input_file);
return 0;
}
cmd:
гибкая практика.l
gcc -C lex.yy.c
./a.out
вывод такой.
Input text from the file:
My name is xyz.
123123 @!$%(@#)
124adasd31231
Character count: 0
Word count: 0
Digit count: 0
Vowel count: 0
Consonant count: 0
Special character count: 0
Line count: 0
где может быть ошибка? пожалуйста помоги.
1 ответ
The fgets
цикл потребляет содержимое файла так, чтоfeof(input_file)
будет истинным после цикла (при условии отсутствия ошибок). Это ничего не оставляет дляyylex
обрабатывать.
rewind
файл после его прочтения.
rewind(input_file);
yyin = input_file;
yylex();
Полученные результаты:
Input text from the file:
My name is xyz.
123123 @!$%(@#)
124adasd31231
Character count: 46
Word count: 0
Digit count: 14
Vowel count: 5
Consonant count: 11
Special character count: 9
Line count: 3