咳咳。这部分应该是序列化编译器DIY的,然而,在这样做DIY第一次使用前flex 为了练练手,对于后者的理解是有帮助。
在word 我经常看到一个字计数功能,因此,它是如何实现,当然,首先想到的是要经过整个文本换行和空格分析字符串,。但是能不能简单点了,事实上对文本做单词分析,大家都知道怎么做,难得地方可能就是代码的实现了。那么如今假设使用正則表達式来实现的话,那么一切问题就Over 了。
环境:ubuntu(当然装了flex的windows和mac也能够)
原码:
%{
unsigned long chars=0;
unsigned long words=0;
unsigned long lines=0;
%}
%%
[a-zA-Z]+ {words++;chars+=strlen(yytext);}
[a-z\-A-z]+ {words++;chars+=strlen(yytext);}
[0-9]+ {words++;chars+=strlen(yytext);}
[.|,|\b| |\t|\r] {chars++;}
[\n] {lines++;chars++;}
%%
int main()
{
char filename[100];
printf("统计一个英文文件里字符、单词、行数。\n");
printf("请输入要计算的文件名称:");
scanf("%s",filename);
yyin=fopen(filename,"r");
printf("開始进行统计...\n");
printf("没有定义的字符:");
yylex();
printf("\n字符数:%ld\n", chars);
printf("单词数:%ld\n", words);
printf("行数 :%ld\n", lines);
return 1;
}
int yywrap()
{
return 1;
}
那么解释第一个正则式[a-zA-Z]+ 表示一个或者多个由大写和小写字母组成的单词
[a-z\-A-z]+ 对于特殊的中间加"-"的单词
[0-9]+ 数字集合
[.|,|\b| |\t|\r] 特殊符号集合
在编写完上述代码之后,那么直接用flex 进行编译。将得到一个.c文件,接着对C文件编译生成二进制代码执行就可以。
測试文本:
my name is te-name
%%%
測试结果:
统计一个英文文件里字符、单词、行数。
请输入要计算的文件名称:test.txt
開始进行统计...
没有定义的字符:%%%
字符数:20
单词数:4
行数 :2
版权声明:本文博客原创文章。博客,未经同意,不得转载。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4643724.html,如需转载请自行联系原作者