3

我对 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;
}

字数统计和其他工作完美......但是单词搜索正在输入但没有给出具体计数......我该如何改进代码?我需要添加什么吗?

提前致谢...... :)

4

2 回答 2

2

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

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

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

如您所见,我已删除所有出现的 result[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;
}
于 2013-09-04T22:43:50.480 回答
0
{result} {
    if((strstr(temp, str)) != 0)

结果[字]

结果是 characters 的正则表达式'w', 'o', 'r', 'd',这不是您想要的。您可能想在{word}. 此外,temp将始终为 null - 我认为您想yytext改用它。

于 2013-08-30T17:32:57.483 回答