我对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;
}
单词计数和其他单词工作正常......但是单词搜索是在接受输入但未给出具体计数......我如何改进代码? 我需要添加任何东西吗?
先谢谢......:)
答案 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
。