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

时间:2019-01-17 10:45:56

标签: c flex-lexer

^ 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]!='\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 :(得分:1)

这整段代码绝对没有道理。您要查找一系列字母,后跟一个空格或换行符,然后执行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++;}

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