Не удалось найти решение ошибки ^ D в yylex - PullRequest
0 голосов
/ 17 января 2019

^ D не работает в функции yylex ()

Я знаю основы гибкого

%{
#include<stdio.h>
int c=0;
int blank=0;
int line=0;
int word=0;
%}
%%
([a-zA-z])+(" "|\n) {word++; int i=0; 
while(yytext[i]!='\0')
{
if(yytext[i]=' ') blank++;
else if(yytext[i]=='\n') line++;
}

}
" " {blank++;  c++;}
\n {line++; c++;}
. {c++;}
%%
int main()
{
yylex();
printf("The no of characters is %d\n",c);

printf("The no of blanks is %d\n",blank);

printf("The no of lines is %d\n",line);

printf("The no of words is %d\n",word);
}

Я очень старался, но ничего не мог придумать , Пожалуйста, помогите, я застрял на этом.

1 Ответ

0 голосов
/ 17 января 2019

Весь этот фрагмент кода не имеет абсолютно никакого смысла. Вы ищете последовательность букв, за которыми следует пробел или символ новой строки, а затем выполняете цикл 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++;}

... так как другие правила будут обрабатывать счетные пробелы и переводы строк и т.д ...

...