无法在 yylex 中找到 ^D 错误的解决方案

Unable to find solution to ^D error in yylex

^D 在 yylex() 函数中不起作用

我了解 flex 的基础知识

%{
#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]!='[=10=]')
{
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);
}

试了很多都想不出来 .请帮我解决这个问题。

这整段代码毫无意义。您正在寻找一系列字母后跟 space 或换行符,然后执行 while 循环以查看 yytext 中的第一个字符(您永远不会更改 i 的值)何时出现等于恰好为空的字符串?

([a-zA-z])+(" "|\n) {word++; int i=0; 
while(yytext[i]!="[=10=]")
{
if(yytext[i]=" ") blank++;
else if(yytext[i]=="\n") line++;
}

}

如果您正在寻找 NUL 终止字符,您需要将其指定为字符而不是将其放在双引号中。并且您还需要递增 i 以便遍历整个 yytext。按照目前的情况,您的 while 循环将永远不会终止,这就解释了为什么 ^D 没有做任何事情。但您不需要执行任何操作。

既然你只是在计算有多少个单词,那么你需要做的就是...

([a-zA-z])+ {word++;}

...因为其他规则将处理计数 spaces 和换行符等...