闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞鐟滃繘寮抽敃鍌涚厱妞ゎ厽鍨垫禍婵嬫煕濞嗗繒绠抽柍褜鍓欑粻宥夊磿闁单鍥敍濠婂懐鐒奸柣搴秵閸嬩焦绂嶅⿰鍫熺厸闁告劑鍔岄埀顒傛暬楠炲繘鍩勯崘褏绠氬銈嗗姂閸婃洟寮搁幋婢㈠酣宕惰闊剟鏌熼鐣屾噰妞ゃ垺妫冨畷鐔煎Ω閵夈倕顥氶柣鐔哥矊缁绘帡宕氶幒鎾剁瘈婵﹩鍓涢娲⒑閹稿孩鐓ラ柛妯荤矒瀹曟垿骞樼紒妯绘珖闂侀€炲苯澧撮柟顕€绠栭弫鎾绘偐閼碱剦鍚嬫俊鐐€栧Λ浣规叏閵堝鏁婇柡鍥ュ灪閳锋帒霉閿濆懏鎲哥紒澶屽劋娣囧﹪顢曢姀鈥充淮闂佽鍠氶崑銈夊极閸愵喖纾兼慨妯块哺閻擄綁姊绘担鍝ョШ婵☆偄娼¢幃鐐烘晝閸屾稑浜楅梺闈涱槴閺呮粓鎮¢悢鍏肩厸闁搞儮鏅涙禒婊堟煃瑜滈崜娆忥耿闁秴鐒垫い鎺嶈兌閸熸煡鏌熼崙銈嗗     婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i姀鐘差棌闁轰礁锕弻鈥愁吋鎼粹€崇闂傚倸鍋嗛崹閬嶅Φ閸曨垰鍐€闁靛ě鍛帎缂傚倷娴囩紙浼村磹濠靛钃熼柨婵嗩槹閺呮煡鏌涘☉鍗炴灍闁圭兘浜堕幃妤冩喆閸曨剛顦ㄩ梺缁樻惈缁绘繂顕f繝姘亜閻炴稈鈧厖澹曞┑鐐村灦椤忎即骞嬮敃鈧壕鍧楁煛閸モ晛鏋旂紒鐘荤畺閺岀喓鈧稒岣块幊鍐煟韫囧﹥娅婇柡宀嬬秮楠炴ḿ鈧潧鎲¢崚娑㈡⒑閸濆嫭婀伴柣鈺婂灦閻涱噣宕堕鈧粈鍌炴煕濠靛嫬鍔滈柡鍛偢濮婄粯鎷呴搹鐟扮闂佺懓鎲¢幃鍌炪€侀弽銊ョ窞濠电姴瀛╃紞搴♀攽閻愬弶鈻曞ù婊勭矒楠炴垿鎳滈悙閫涚盎闂佽宕樺▔娑欑濠婂啠鏀介柍鈺佸暞閵囨繃鎱ㄦ繝鍛仩闁瑰弶鎸冲畷鐔碱敇閻旂ǹ鏅搁梺璇叉唉椤煤閻斾赴缂氱憸鏃堛€佸璺何ㄩ柨鏂垮⒔閻﹀牓姊洪幖鐐插姌闁告柨绉撮埢宥夊閵堝棌鎷洪柣鐘充航閸斿苯鈻嶉幇鐗堢厵闁告垯鍊栫€氾拷

45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:怎么样使用lex统计文本文件字符数?

怎么样使用lex统计文本文件字符数?

2016-09-04 09:11:30 来源:www.45fan.com 【

怎么样使用lex统计文本文件字符数?

我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数。让我觉得Lex确实挺有意思的。确实Lex的功能非常强大,用来做小巧的词法分析非常适合,也非常好用。这个程序参考了《Lex与Yacc》上的一个例子。

%{

unsignedintchar_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;

unsignedintcurrent_file=0;

unsignedinttotal_file=0;

unsignedinttotal_cc=0;

unsignedinttotal_wc=0;

unsignedinttotal_lc=0;

typedefstructfile_info{

unsignedintc;

unsignedintw;

unsignedintl;

char*name;

}INFO;

INFO**all;

intcreate_info(intnum)

{

INFO*tmp;

inti;

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;

}

return1;

}

intdelete_info(intnum)

{

inti;

if((all==(INFO**)0)||num<=0){

return-1;

}

for(i=0;i<num;i++){

free(all[i]);

}

free(all);

return1;

}

intset_info(intpos)

{

intlength=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];

return1;

}

intmain(intargc,char**argv)

{

FILE*file;

intposition=0;

inti;

file_list=argv+1;

total_file=argc-1;

current_file=0;

printf("--------------------------------------------------------------/n",

total_file);

if(argc>1){

if(create_info(total_file)==-1){

fprintf(stderr,"%s/n","Encounteraerrorwhenmallocmemory.");

exit(1);

}

}

if(argc==2){

file=fopen(argv[1],"r");

if(!file){

fprintf(stderr,"Couldnotopen%s./n",argv[1]);

delete_info(total_file);

exit(1);

}

yyin=file;

}

yywrap();

yylex();

if(argc>1){

total_cc+=char_count;

total_wc+=word_count;

total_lc+=line_count;

if(set_info(current_file-1)==-1){

fprintf(stderr,"%s/n","Encounteraerrorwhensetinformationto

INFO.");

delete_info(total_file);

exit(1);

}

for(i=0;i<total_file;i++){

printf("char:%-8luword:%-8luline:%-8lufilename:%s/n",all[i]->

c,all[i]->w,all[i]->l,file_list[i]);

}

printf("-----------------------total--------------------------------

/n");

printf("chars:%-8luwords:%-8lulines:%-8lufiles:%d/n",total_cc,tot

al_wc,total_lc,total_file);

}else{

printf("char:%-8luword:%-8luline:%-8lu/n",char_count,word_count,l

ine_count);

}

delete_info(total_file);

return0;

}

yywrap()

{

FILE*file=NULL;

if((current_file>0)&&(current_file<total_file)&&(total_file>1))

{

total_cc+=char_count;

total_wc+=word_count;

total_lc+=line_count;

if(set_info(current_file-1)==-1){

fprintf(stderr,"%s/n","Encounteraerrorwhensetinformationto

INFO.");

delete_info(total_file);

exit(1);

}

char_count=word_count=line_count=0;

fclose(yyin);

}

while((file_list[current_file]!=(char*)0)&&(current_file<total_fil

e)){

file=fopen(file_list[current_file++],"r");

if(!file){

fprintf(stderr,"couldnotopen%s.",file_list[current_file-1]

);

}else{

yyin=file;

break;

}

}

return(file?0:1);

}

 

本文地址:http://www.45fan.com/a/question/72058.html
Tags: 统计 文本 lex
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部