如何在给定输入文件的情况下搜索lex中的特定单词?

时间:2013-08-30 16:46:46

标签: lex

我对lex很新。我正在尝试开发一个解析器来搜索给定输入文件中特定单词的计数...

我的代码是

%{
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int lnum = 1, fresult = 0, cc=0, wc=0, lc=0, bc=0, sc=0, nc=0, tc=0, result;
    char temp[20], str[20], fname[20];
    FILE *fp;
    #undef yywrap
%}
digit[0-9]+
word [a-zA-Z]+
eol  [\n]
blank [ ]
tab   [\t]
result [word]
%%
{result} {
    if((strstr(temp, str)) != 0)
    {
        printf(" A match found on line: %d\n", lnum);
        fresult++;
        wc++;
        cc+=yyleng;
    }
    lnum++;
    if(fresult == 0)
    {
        printf(" Match not found\n");
    }
}
{digit} {nc++;}
{word}  {wc++; cc+=yyleng;}
{tab}   {tc++;}
{blank} {bc++;}
{eol}   {lc++;}
.    sc++;

%%

int main(int argc, char *argv[])
{
    strcpy(fname,argv[1]);
    strcpy(str,argv[2]);
    fp=fopen(fname,"r+");
    yyin=fp;
    yylex();
    printf(" Total count of the word is :%d\n", fresult);
    printf(" Character Count = %d\n", cc);
    printf(" Number Count = %d\n", nc);
    printf(" Word Count = %d\n", wc);
    printf(" Line Count = %d\n", lc);
    printf(" Special Character Count = %d\n", sc);
    printf(" Blank Count = %d\n", bc);
    printf(" Tab Count = %d\n", tc);
    return(0);
}
int yywrap()
{
    return -1;
}

单词计数和其他单词工作正常......但是单词搜索是在接受输入但未给出具体计数......我如何改进代码? 我需要添加任何东西吗?

先谢谢......:)

2 个答案:

答案 0 :(得分:1)

我对您的代码进行了一些更改,以帮助您朝着正确的方向前进。首先,我创建了一个变量来跟踪是否找到匹配项。

其次,我不再使用strstr(),而是使用strcmp(),因为您希望将单词与单词匹配而不是句子中的单词,并且我们不需要返回指针。 strcmp()很好,因为我们只得到一个整数。

我看到你试图用result [word]做什么,但是,正如你发现的那样,这是行不通的。 Flex文件的此部分称为规则部分。在这里,您可以使用在上一节( definitions )中定义的正则表达式来告诉Flex在匹配规则时要执行的操作。

正如您所看到的,我删除了所有出现的结果[word] - 因为这不起作用。在规则部分中,我还删除了result定义,因为我们不再有匹配它的规则。但是,我保留了result定义的代码,并将其简单地应用于word定义。

最后一个重大更改是添加<<EOF>>规则,这是一条特殊规则,告诉Flex在遇到文件末尾时要做什么。在我们的例子中,如果匹配变量不是1,那么我们没有找到匹配项,我们希望将其打印到屏幕上。我们还需要调用yyterminate()(页面底部的定义)来停止词法分析器。

以下是更新的代码。我希望有所帮助!

%{
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int lnum = 1, fresult = 0, cc=0, wc=0, lc=0, bc=0, sc=0, nc=0, tc=0, result;
    char temp[20], str[20], fname[20];
    FILE *fp;
    int match = 0;//For keeping track of matches
    #undef yywrap
%}

/*Rules*/

digit   [0-9]+
word    [a-zA-Z]+
eol     [\n]
blank   [ ]
tab     [\t]

/*Definitions*/
%%

{digit} {
            nc++;
        }
{tab}   {           
            tc++;
        }
{blank} {       
            bc++;
        }
{eol}   {       
            lc++;
        }   
{word}    {
            if((strcmp(yytext, str)) == 0)//We found a match
            {
                printf("\n A match found on line: %d\n", lnum);
                fresult++;
                wc++;
                cc+=yyleng;
                match = 1;//We have a match         
            }
            else //We found a word, but it was not a match
            {
                wc++;
            }

        }
.   {   
        sc++;
    }
<<EOF>> {   
            if(!match)
            {   
                printf(" Match not found\n");
            }
            yyterminate();
        }

%%

int main(int argc, char *argv[])
{
    strcpy(fname,argv[1]);
    strcpy(str,argv[2]);
    fp = fopen(fname,"r+");
    yyin = fp;
    yylex();
    printf("\n\n Total count of the word is :%d\n", fresult);
    printf(" Character Count = %d\n", cc);
    printf(" Number Count = %d\n", nc);
    printf(" Word Count = %d\n", wc);
    printf(" Line Count = %d\n", lc);
    printf(" Special Character Count = %d\n", sc);
    printf(" Blank Count = %d\n", bc);
    printf(" Tab Count = %d\n", tc);

    fclose(fp);
    return(0);
}
int yywrap()
{
    return 1;
}

答案 1 :(得分:0)

{result} {
    if((strstr(temp, str)) != 0)
  

结果[word]

结果是字符'w', 'o', 'r', 'd'的正则表达式,这不是您想要的。您可能希望在{word}上匹配。此外,temp将始终为空 - 我认为您想要使用yytext