编译器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

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

时间: 06-10

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

统计python文件中的代码,注释,空白对应的行数

其实代码和空白行很好统计,难点是注释行 python中的注释分为以#开头的单行注释 或者以'''开头以'''结尾 或以"""开头以"""结尾的文档注释,如: ''' hello world '''和 ''' hello world''' 思路是用is_comment记录是否存在多行注释,如果不存在,则判断当前行是否以'''开头,是则将is_comment设为True,否则进行空行.当前行注释以及代码行的判断,如果is_comment已经为True

作业-- 统计文本文件中的字符数、单词数、行数

用AndroidStudio解析统计文本文件中的字符数.单词数.行数. 代码部分: package administrator.mc; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widge

【ThinkingInC++】4、统计txt文本中单词的个数

其中要使用的txt文本! header defines classes for file IO, including ifstream, whose constructor takes a file name an argument. The expression f >> word extracts the next non-whitespace token from the file and returns the stream. When a stream appears in a bo

Android 简单统计文本文件字符数、单词数、行数Demo

做的demo是统计文本文件的字符数.单词数.行数的,首先呢,我们必须要有一个文本文件.所以我们要么创建一个文本文件,并保存,然后再解析:要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析.我感觉第二种方法不可行,因为要测试时,肯定要多次测试,每次还要找到文件再修改文件内容,过于麻烦.所以我用的第一种方法,文件内容更改后直接保存即可. 首先是 页面布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res

python学习之——计算给出代码中注释、代码、空行的行数

题目:计算给出代码中注释.代码.空行的行数 来源:网络 思路:注释行以 ‘#’开头,空行以 ‘\n’ 开头,以此作为判断 def count_linenum(fname): fobj = open(fname,"rU") #print fobj.readlines() count_blankline = 0 count_notes = 0 count_code = 0 for eachLine in fobj: if eachLine[0] == '\n': count_blankli

CI中获取读操作的结果集行数+获取写操作的影响行数

本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows(). CI中的方法: 读操作,获取行数: $query->num_rows() 该函数将会返回当前请求的行数.在本例子中, $query 表示当前 SQL 所产生的请求结果对象:

php字符串英文文本中大写字母,小写字母,空格,标点符号的个数统计

对一段英文文本的信息,统计其中大写字母,小写字母,空格,标点符号的个数 <?php$manuscript = "Where there is a will, there is a way.";//字符串文本$smallLetter = 0;$capitalLetter = 0;$blank = 0;$punctuation = 0; $num=strlen($manuscript);$arr=str_split($manuscript);//字符串分割为数组foreach($ar

Ruby中定义wc方法来统计单词数和行数等

在Ruby中我们定义一个wc方法,用来统计文件中出现的文本行数.单词数和字符数,ruby代码程序如下: def wc(filename)   nline = nword = nchar = 0   File.open(filename) do |io|     io.each_line do |line|       words = line.split(/\s+/).reject{|w| w.empty? }       #本例中使用了split方法分割单词,当行首有空白字符时,split方法

使用SQL除掉文本中特殊的ascll字符比如Enter,Tab,空格键

一.在SQL查询的字段中如果包含tab.enter.空格键,可以使用ascii码进行替换: --替换了文本中含有tab键,Enter键,空格键的ascii码 select REPLACE(REPLACE(REPLACE(Fields,CHAR(9),''),CHAR(10),''),CHAR(13),'') from Table