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

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




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值