MyLib.cpp
上传用户:sz_zxd888
上传日期:2021-08-19
资源大小:6059k
文件大小:11k
源码类别:

词法分析

开发平台:

C/C++

  1. /////////////////////////////////////////////////////////////////////////////////////
  2. // File Name   : MyLib.cpp
  3. // Project Name: IRLAS
  4. // Author      : Huipeng Zhang (zhp@ir.hit.edu.cn)
  5. // Environment : Microsoft Visual C++ 6.0
  6. // Description : some utility functions
  7. // Time        : 2005.9
  8. // History     : 
  9. // CopyRight   : HIT-IRLab (c) 2001-2005, all rights reserved.
  10. /////////////////////////////////////////////////////////////////////////////////////
  11. #include "MyLib.h"
  12. void replace_char_by_char(string &str, char c1, char c2)
  13. {
  14. string::size_type pos = 0;
  15. for (; pos < str.size(); ++pos) {
  16. if (str[pos] == c1) {
  17. str[pos] = c2;
  18. }
  19. }
  20. }
  21. // remove the blanks of string
  22. void remove_space(string &str) 
  23. {
  24. vector<string> vecTmp;
  25. split_bychar(str, vecTmp, ' ');
  26. join_bystr(vecTmp, str, "");
  27. }
  28. void join_bystr(const vector<string> &vec, string &str, const string &sep) { str = ""; if (vec.empty()) return; str = vec[0]; int i = 1; for(; i < vec.size(); ++i) { str += sep + vec[i]; } }
  29. // remove the blanks at the begin and end of string
  30. void clean_str(string &str) 
  31. {
  32. int i = 0;
  33. for (; i < str.size(); ++i) {
  34. if (str[i] != ' ' && str[i] != 't'
  35. && str[i] != 'n' && str[i] != 'r')
  36. {
  37. break;
  38. }
  39. }
  40. if (i > 0)
  41. {
  42. str.erase(0, i);
  43. }
  44. i = str.size() - 1;
  45. for (; i >= 0; --i) 
  46. {
  47. if (str[i] != ' ' && str[i] != 't'
  48. && str[i] != 'n' && str[i] != 'r')
  49. {
  50. break;
  51. }
  52. }
  53. if (i < str.size() - 1)
  54. {
  55. str.erase(i+1, str.size() - (i+1));
  56. }
  57. }
  58. /////////////////////////////////////////////////////////////////////////////////////
  59. /// split a sentence into a vector by separator which is a char.
  60. /////////////////////////////////////////////////////////////////////////////////////
  61. void split_bychar(const string& str, vector<string>& vec, const char separator)
  62. {
  63. assert(vec.empty());
  64. string::size_type pos1 = 0, pos2 = 0;
  65. string word;
  66. while((pos2 = str.find_first_of(separator, pos1)) != string::npos)
  67. {
  68. word = str.substr(pos1, pos2-pos1);
  69. pos1 = pos2 + 1;
  70. if(!word.empty()) 
  71. vec.push_back(word);
  72. }
  73. word = str.substr(pos1);
  74. if(!word.empty())
  75. vec.push_back(word);
  76. }
  77. /////////////////////////////////////////////////////////////////////////////////////
  78. /// convert a string to a pair splited by separator which is '/' by default.
  79. /////////////////////////////////////////////////////////////////////////////////////
  80. void string2pair(const string& str, pair<string, string>& pairStr, const char separator)
  81. {
  82. string::size_type pos;
  83. pos = str.find_first_of(separator, 0);
  84. pairStr.first = str.substr(0, pos);
  85. if (pos != string::npos) 
  86. {
  87. pairStr.second = str.substr(pos+1);
  88. }
  89. else 
  90. {
  91. pairStr.second = "";
  92. }
  93. }
  94. /////////////////////////////////////////////////////////////////////////////////////
  95. /// convert every item separated by '/' in a vector to a pair.
  96. /////////////////////////////////////////////////////////////////////////////////////
  97. void convert_to_pair(const vector<string>& vecString, 
  98.  vector< pair<string, string> >& vecPair)
  99. {
  100. assert(vecPair.empty());
  101. int size = vecString.size();
  102. string::size_type cur;
  103. string strWord, strPos;
  104. for(int i = 0; i < size; ++i)
  105. {
  106. cur = vecString[i].rfind('/');
  107. if (cur == string::npos) 
  108. {
  109. strWord = vecString[i];
  110. strPos = "";
  111. }
  112. else {
  113. strWord = vecString[i].substr(0, cur);
  114. strPos = vecString[i].substr(cur + 1);
  115. }
  116. if (strWord.empty() || strPos.empty()) {
  117. cerr << "strWord: #" << strWord << "#n"
  118. << "strPos: #" << strPos << "#n";
  119. }
  120. vecPair.push_back(pair<string, string>(strWord, strPos));
  121. }
  122. }
  123. /////////////////////////////////////////////////////////////////////////////////////
  124. /// the combination of split_bychar and convert_to_pair.
  125. /////////////////////////////////////////////////////////////////////////////////////
  126. void split_to_pair(const string& str, vector< pair<string, string> >& vecPair)
  127. {
  128. assert(vecPair.empty());
  129. vector<string> vec;
  130. split_bychar(str, vec);
  131. convert_to_pair(vec, vecPair);
  132. }
  133. /////////////////////////////////////////////////////////////////////////////////////
  134. /// delete the white(space, Tab or a new line) on the two sides of a string.
  135. /////////////////////////////////////////////////////////////////////////////////////
  136. void chomp(string& str)
  137. {
  138. string white = " tn";
  139. string::size_type pos1 = str.find_first_not_of(white);
  140. string::size_type pos2 = str.find_last_not_of(white);
  141. if (pos1 == string::npos || pos2 == string::npos) 
  142. {
  143. str = "";
  144. }
  145. else
  146. {
  147. str = str.substr(pos1, pos2-pos1+1);
  148. }
  149. }
  150. /////////////////////////////////////////////////////////////////////////////////////
  151. /// get the length of the longest common string of two strings.
  152. /////////////////////////////////////////////////////////////////////////////////////
  153. int common_substr_len(string str1, string str2)
  154. {
  155. string::size_type minLen;
  156. if (str1.length() < str2.length()) 
  157. {
  158. minLen = str1.length();
  159. }
  160. else
  161. {
  162. minLen = str2.length();
  163. str1.swap(str2); //make str1 the shorter string
  164. }
  165. string::size_type maxSubstrLen = 0;
  166. string::size_type posBeg;
  167. string::size_type substrLen;
  168. string sub;
  169. for (posBeg = 0; posBeg < minLen; posBeg++) 
  170. {
  171. for (substrLen = minLen-posBeg; substrLen > 0; substrLen--) 
  172. {
  173. sub = str1.substr(posBeg, substrLen);
  174. if (str2.find(sub) != string::npos) 
  175. {
  176. if (maxSubstrLen < substrLen) 
  177. {
  178. maxSubstrLen = substrLen;
  179. }
  180. if (maxSubstrLen >= minLen-posBeg-1) 
  181. {
  182. return maxSubstrLen;
  183. }
  184. }
  185. }
  186. }
  187. return 0;
  188. }
  189. /////////////////////////////////////////////////////////////////////////////////////
  190. /// compute the index of a Chinese character. 
  191. /// the input can be any string whose length is larger than 2.
  192. /////////////////////////////////////////////////////////////////////////////////////
  193. int get_chinese_char_index(string& str)
  194. {
  195. assert(str.size() == 2);
  196. return ((unsigned char)str[0]-176)*94 + (unsigned char)str[1] - 161;
  197. }
  198. /////////////////////////////////////////////////////////////////////////////////////
  199. /// judge if a string is a Hanzi.
  200. /////////////////////////////////////////////////////////////////////////////////////
  201. bool is_chinese_char(string& str)
  202. {
  203. if (str.size() != 2) 
  204. {
  205. return false;
  206. }
  207. int index = ((unsigned char)str[0]-176)*94 + (unsigned char)str[1] - 161;
  208. if (index >= 0 && index < 6768) 
  209. {
  210. return true;
  211. }
  212. else
  213. {
  214. return false;
  215. }
  216. }
  217. /// all defined separators
  218. string separators = "。,?!、:—“”《》()%¥℃/·",.?!:'/;;()%"; 
  219. /////////////////////////////////////////////////////////////////////////////////////
  220. /// judge if a string is a separator.
  221. /////////////////////////////////////////////////////////////////////////////////////
  222. bool is_separator(string& str)
  223. {
  224. if (separators.find(str) != string::npos && str.size() <= 2) 
  225. {
  226. return true;
  227. }
  228. else 
  229. {
  230. return false;
  231. }
  232. }
  233. /////////////////////////////////////////////////////////////////////////////////////
  234. /// find GB char which is two-char-width and the first char is negative.
  235. /// it is a little different from string::find.
  236. /////////////////////////////////////////////////////////////////////////////////////
  237. int find_GB_char(const string& str, string wideChar, int begPos)
  238. {
  239. assert(wideChar.size() == 2 && wideChar[0] < 0); //is a GB char
  240. int strLen = str.size();
  241. if (begPos >= strLen) 
  242. {
  243. return -1;
  244. }
  245. string GBchar;
  246. for (int i = begPos; i < strLen-1; i++) 
  247. {
  248. if (str[i] < 0) //is a GB char 
  249. {
  250. GBchar = str.substr(i, 2);
  251. if (GBchar == wideChar) 
  252. return i;
  253. else 
  254. i++;
  255. }
  256. }
  257. return -1;
  258. }
  259. /////////////////////////////////////////////////////////////////////////////////////
  260. /// split a line to sentences separated by period.
  261. /////////////////////////////////////////////////////////////////////////////////////
  262. void split_to_sentence_by_period(const string& line, vector<string>& vecSentence)
  263. {
  264. assert(vecSentence.empty());
  265. int pos1 = 0, pos2 = 0;
  266. string sentence;
  267. while((pos2 = find_GB_char(line, "。", pos1)) != -1)
  268. {
  269. sentence = line.substr(pos1, pos2-pos1+2);
  270. pos1 = pos2 + 2;
  271. if(!sentence.empty()) 
  272. vecSentence.push_back(sentence);
  273. }
  274. sentence = line.substr(pos1);
  275. if(!sentence.empty())
  276. vecSentence.push_back(sentence);
  277. }
  278. /////////////////////////////////////////////////////////////////////////////////////
  279. /// it is similar to split_bychar, except that the separator can be a string.
  280. /////////////////////////////////////////////////////////////////////////////////////
  281. void split_by_separator(const string& str, vector<string>& vec, const string separator)
  282. {
  283. assert(vec.empty());
  284. string::size_type pos1 = 0, pos2 = 0;
  285. string word;
  286. while((pos2 = find_GB_char(str, separator, pos1)) != -1)
  287. {
  288. word = str.substr(pos1, pos2-pos1);
  289. pos1 = pos2 + separator.size();
  290. if(!word.empty()) 
  291. vec.push_back(word);
  292. }
  293. word = str.substr(pos1);
  294. if(!word.empty())
  295. vec.push_back(word);
  296. }
  297. /////////////////////////////////////////////////////////////////////////////////////
  298. /// judge if a string is a Chinese number.
  299. /////////////////////////////////////////////////////////////////////////////////////
  300. bool is_chinese_number(const string& str)
  301. {
  302. if (str == "一" || str == "二" || str == "三" || str == "四" || str == "五" ||
  303. str == "六" || str == "七" || str == "八" || str == "九" || str == "十" ||
  304. str == "两" || str == "几" || str == "零" || str == "〇" || str == "百" ||
  305. str == "千" || str == "万" || str == "亿") 
  306. {
  307. return true;
  308. }
  309. else
  310. {
  311. return false;
  312. }
  313. }
  314. /////////////////////////////////////////////////////////////////////////////////////
  315. /// compute the total time used by a program.
  316. /////////////////////////////////////////////////////////////////////////////////////
  317. void compute_time()
  318. {
  319. clock_t tick = clock();
  320. double t = (double)tick / CLK_TCK;
  321. cout << endl << "The time used: " << t << " seconds." << endl;
  322. }
  323. /////////////////////////////////////////////////////////////////////////////////////
  324. /// for example: "高兴/a" -> "高兴".
  325. /////////////////////////////////////////////////////////////////////////////////////
  326. string word(string& word_pos)
  327. {
  328. return word_pos.substr(0, word_pos.find("/"));
  329. }
  330. /////////////////////////////////////////////////////////////////////////////////////
  331. /// judge if a string purely consist of ASCII characters.
  332. /////////////////////////////////////////////////////////////////////////////////////
  333. bool is_ascii_string(string& word)
  334. {
  335. for (unsigned int i = 0; i < word.size(); i++)
  336. {
  337. if (word[i] < 0)
  338. {
  339. return false;
  340. }
  341. }
  342. return true;
  343. }