Весь этот фрагмент кода не имеет абсолютно никакого смысла. Вы ищете последовательность букв, за которыми следует пробел или символ новой строки, а затем выполняете цикл while, чтобы увидеть, когда первый символ (вы никогда не меняете значение i
) в yytext
равен строке, которая происходит с быть пустым?
([a-zA-z])+(" "|\n) {word++; int i=0;
while(yytext[i]!="\0")
{
if(yytext[i]=" ") blank++;
else if(yytext[i]=="\n") line++;
}
}
Если вы ищете завершающий символ NUL, вам нужно указать его как символ, а не заключать его в двойные кавычки. И вам также нужно увеличить i
, чтобы пройти через все yytext
. В настоящее время ваш цикл while
никогда не прекратится, что объясняет, почему ^ D ничего не делает. Но вам не нужно ничего этого делать.
Поскольку все, что вам нужно, это подсчитать, сколько слов, все, что вам нужно сделать, это ...
([a-zA-z])+ {word++;}
... так как другие правила будут обрабатывать счетные пробелы и переводы строк и т.д ...