lex程序来计算单词数量

时间:2016-04-28 05:50:11

标签: lex

我制作了以下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

1 个答案:

答案 0 :(得分:1)

首先,manav与您对单词的定义完全匹配。它前面的9.规则匹配。请记住,白色空间在lex中并不特殊。

通过添加另一个规则[0-9][a-zA-Z0-9_]* ;,您有了正确的想法,但由于规则集不明确(有几种方法可以匹配输入)规则的顺序很重要。我和lex工作了一段时间,但我认为在规则这个词之前加上新规则应该有效。