码迷,mamicode.com
首页 > 其他好文 > 详细

编译器DIY之———统计英文文本中的单词数,字符数和行数

时间:2014-06-10 10:56:00      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:正则表达式   编译器   

咳咳,这一章节应该是连载编译器的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




编译器DIY之———统计英文文本中的单词数,字符数和行数,布布扣,bubuko.com

编译器DIY之———统计英文文本中的单词数,字符数和行数

标签:正则表达式   编译器   

原文地址:http://blog.csdn.net/q745401990/article/details/29801141

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!