gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:37:18 28 4
gpt4 key购买 nike

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

字数统计和其他功能运行良好....但字词搜索正在输入但未给出具体计数......我该如何改进代码?我需要添加什么吗?

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

最佳答案

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

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

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

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

最后一个主要变化是添加 <<EOF>> rule 这是一个特殊的规则,它告诉 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;
}

关于lex - 如何在给定输入文件的 lex 中搜索特定单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18537840/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com