C语言中使用语言中使用lex统计文本文件字符数统计文本文件字符数
主要介绍了C语言中使用lex统计文本文件字符数,本文直接给出实现代码,需要的朋友可以参考下
我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数。让我觉得Lex确实
挺有意思的。确实Lex的功能非常强大,用来做小巧的词法分析非常适合,也非常好用。这个程序参考了《Lex与Yacc》上的
一个例子。
%{
unsigned int char_count = 0, word_count = 0, line_count = 0;
%}
%%
[^ /t/n]+ {word_count++; char_count+=yyleng;};
/n {char_count++; line_count++;};
. char_count++;
%%
char **file_list;
unsigned int current_file = 0;
unsigned int total_file = 0;
unsigned int total_cc = 0;
unsigned int total_wc = 0;
unsigned int total_lc = 0;
typedef struct file_info{
unsigned int c;
unsigned int w;
unsigned int l;
char *name;
}INFO;
INFO **all;
int create_info(int num)
{
INFO *tmp;
int i;
if (num <= 0){
return -1;
}
all = (INFO **)malloc(sizeof(int *)*num);
for (i = 0; i < num; i++){
tmp = (INFO *)malloc(sizeof(INFO));
tmp->c = 0;
tmp->w = 0;
tmp->l = 0;
tmp->name = NULL;
all[i] = tmp;
}
return 1;
}
int delete_info(int num)
{
int i;
if ((all == (INFO **)0) || num <= 0){
return -1;
}
for (i = 0; i < num; i++){
free(all[i]);
}
free(all);
return 1;
}
int set_info(int pos)
{
int length = 0;
if (pos < 0){
return -1;
}
all[pos]->c = char_count;
all[pos]->w = word_count;
all[pos]->l = line_count;
all[pos]->name = file_list[pos];
return 1;
}
评论0