我制作了以下lex程序来计算文本文件中的单词数。对我来说,'Word'是以字母开头的任何字符串,后跟0或更多字母/数字/ _。
%{
int words;
%}
%%
[a-zA-Z][a-zA-Z0-9_]* {words++; printf("%s %d\n",yytext,words);}
. ;
%%
int main(int argc, char* argv[])
{
if(argc == 2)
{
yyin = fopen(argv[1], "r");
yylex();
printf("No. of Words : %d\n",words);
fclose(yyin);
}
else
printf("Invalid No. of Arguments\n");
return 0;
}
问题是对于以下文本文件,我得到了No. of Words : 13
。我尝试打印yytext,它显示它正在从'manav'
中取'9manav'
作为单词,即使它与我对单词的定义不符。
我还尝试在代码中包含[0-9][a-zA-Z0-9_]* ;
,但仍显示相同的输出。我想知道为什么会发生这种情况以及避免它的可能方法。
文本文件: -
the quick brown fox jumps right over the lazy dog cout for
9manav
-99-7-5 32 69 99 +1
答案 0 :(得分:1)
首先,manav
与您对单词的定义完全匹配。它前面的9
与.
规则匹配。请记住,白色空间在lex中并不特殊。
通过添加另一个规则[0-9][a-zA-Z0-9_]* ;
,您有了正确的想法,但由于规则集不明确(有几种方法可以匹配输入)规则的顺序很重要。我和lex工作了一段时间,但我认为在规则这个词之前加上新规则应该有效。