用于计算单词数的 lex 程序
lex program to count the Number of Words
我编写了以下 lex 程序来计算文本文件中的单词数。 'Word' 对我来说是任何以字母开头并后跟 0 次或多次出现的 alphabets/numbers/_ 的字符串。
%{
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,它显示它从 '9manav'
中提取 'manav'
作为一个词,即使它不符合我对词的定义。
我也尝试在我的代码中包含 [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
首先,manav
完全符合您对单词的定义。它前面的 9
匹配 .
规则。请记住,白色 space 在 lex 中并不特殊。
您添加另一条规则的想法是正确的 [0-9][a-zA-Z0-9_]* ;
,但由于规则集不明确(有多种方法可以匹配输入),因此规则的顺序很重要。我使用 lex 有一段时间了,但我认为将新规则放在规则一词之前应该可行。
我编写了以下 lex 程序来计算文本文件中的单词数。 'Word' 对我来说是任何以字母开头并后跟 0 次或多次出现的 alphabets/numbers/_ 的字符串。
%{
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,它显示它从 '9manav'
中提取 'manav'
作为一个词,即使它不符合我对词的定义。
我也尝试在我的代码中包含 [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
首先,manav
完全符合您对单词的定义。它前面的 9
匹配 .
规则。请记住,白色 space 在 lex 中并不特殊。
您添加另一条规则的想法是正确的 [0-9][a-zA-Z0-9_]* ;
,但由于规则集不明确(有多种方法可以匹配输入),因此规则的顺序很重要。我使用 lex 有一段时间了,但我认为将新规则放在规则一词之前应该可行。