当前位置:首页 > 通信资讯 > 正文

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 %{ 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; } int main(int argc, char** argv) { FILE *file; int position = 0; int i; 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", "Encounter a error when malloc memory."); exit(1); } } if (argc == 2){ file=fopen(argv[1], "r"); if (!file){ fprintf(stderr, "Could not open %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", "Encounter a error when set information to INFO."); delete_info(total_file); exit(1); } for (i = 0; i < total_file; i++){ printf("char:%-8lu word:%-8lu line:%-8lu file name:%s/n", all[i]-> c, all[i]->w, all[i]->l, file_list[i]); } printf("----------------------- total -------------------------------- /n"); printf("chars:%-8lu words:%-8lu lines:%-8lu files:%d/n", total_cc, tot al_wc, total_lc, total_file); }else{ printf("char:%-8lu word:%-8lu line:%-8lu/n", char_count, word_count, l ine_count); } delete_info(total_file); return 0; } 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", "Encounter a error when set information to 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, "could not open %s .", file_list[current_file - 1] ); }else{ yyin = file; break; } } return (file? 0 : 1); }
如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。