Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.90 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <set>
  4. #include <string> // подключаем строки
  5. #include <fstream> // подключаем файлы
  6.  
  7. using namespace std; // используем стандартное пространство имен
  8.  
  9. bool isoperator(string curr) // проверка на зарезервированные слова
  10. {
  11. bool is = false; // вывод (по умолчанию значение false, т.е. "введенное слово не является зарезервированным")
  12. set<string> S; // задаем множество строкового типа (все элементы - слова) для этих зарезерварованны
  13. string s = "";
  14. ifstream file("operators.txt"); //открыть
  15. while (getline(file, s)) // пока в файле есть зарезервированные имена
  16. S.insert(s); // добавлять их в множество отдельными элементами
  17. if (S.count(curr) != 0) is = true; // проверка: если curr - есть зарезервированное
  18. file.close();
  19. return is;
  20. }
  21. bool istype(string curr) // проверка на зарезервированные слова
  22. {
  23. bool is = false; // вывод (по умолчанию значение false, т.е. "введенное слово не является зарезервированным")
  24. set<string> S; // задаем множество строкового типа (все элементы - слова) для этих зарезерварованны
  25. string s = "";
  26. ifstream file("types.txt"); //открыть
  27. while (getline(file, s)) // пока в файле есть зарезервированные имена
  28. S.insert(s); // добавлять их в множество отдельными элементами
  29. if (S.count(curr) != 0) is = true; // проверка: если curr - есть зарезервированное
  30. file.close();
  31. return is;
  32. }
  33. enum States { // список состояний
  34. STATE_START,
  35. STATE_FUNCTION,
  36. STATE_ERROR,
  37. STATE_SPACE,
  38. STATE_NAME,
  39. STATE_TWO_POINTS,
  40. STATE_TYPE,
  41. STATE_ENDING,
  42. STATE_BRACKETS
  43.  
  44.  
  45.  
  46. };
  47. string getWay(string fileway) {
  48. cout << "\nВведите путь к файлу: (../filename.txt)" << endl;
  49. cin >> fileway;
  50. cout << endl;
  51. return fileway;
  52. }
  53. void isconst()
  54. {
  55. States st = STATE_START; // СОСТОЯНИЕ 1
  56. string curr = "", answer = "";
  57. string fileway = "";
  58. fileway = getWay(fileway);
  59. ifstream fin("in.txt"); // файл из которого читаем
  60. if (!fin.is_open()) {
  61. cout << "Файл не найден!\n";
  62. isconst();
  63. }
  64. else {
  65. while (!fin.eof()) // пока не конец файла
  66. {
  67. string str;
  68.  
  69. getline(fin, str); //берем строку
  70. int i = 0;
  71.  
  72. int tempam = 2, brackets = 0; // счетчик, меняющийся от 2 до 5 (const содержит 5 букв, будет запускаться, когда 1я уже С, со 2й - проверяет)
  73. bool flag = true;
  74. bool found = false; // был ли ответ
  75. // конкретный
  76.  
  77. while (flag) // пока все нормально
  78. {
  79. switch (st) // смотрим состояния:
  80. {
  81. case STATE_START: // если ПЕРВОЕ
  82. {
  83. switch (str[i]) // смотрим на введенный символ
  84. {
  85. case ' ':st = STATE_START; i++; break; // если пробел, то пропускаем пробелы
  86. case 'f': st = STATE_FUNCTION; answer += str[i]; i++; break; // если буква с, то в состояние 2
  87. case 'F': st = STATE_FUNCTION; answer += str[i]; i++; break; // аналог для заглавной буквы
  88. default: answer = ""; flag = false; st = STATE_START; break; // иначе (недопустимый символ) - в состояние ошибки
  89. } break;
  90.  
  91. }break;
  92. case STATE_FUNCTION: // если ВТОРОЕ
  93. {
  94. if ((str[i] == 'u' || str[i] == 'U') && tempam == 2) // если 2я буква - о,
  95. {
  96. st = STATE_FUNCTION; // то остаемся в этом состоянии
  97. answer += str[i];
  98. i++; // берем следующую букву
  99. tempam++; // сравнивать будем уже с 3ей буквой слова const
  100. }
  101. else if ((str[i] == 'n' || str[i] == 'N') && tempam == 3) // если 3я буква - n,
  102. {
  103. st = STATE_FUNCTION; // то остаемся в этом состоянии
  104. answer += str[i];
  105. i++; // берем следующую букву
  106. tempam++; // сравнивать будем уже с 3ей буквой слова const
  107. }
  108. else if ((str[i] == 'c' || str[i] == 'C') && tempam == 4) // если 4я буква - s,
  109. {
  110. st = STATE_FUNCTION; // то остаемся в этом состоянии
  111. answer += str[i];
  112. i++; // берем следующую букву
  113. tempam++; // сравнивать будем уже с 3ей буквой слова const
  114. }
  115. else if ((str[i] == 't' || str[i] == 'T') && tempam == 5) // если 5я буква - t,
  116. {
  117. st = STATE_FUNCTION;// то в новое состояние
  118. answer += str[i];
  119. tempam++;
  120. i++; // берем следующую букву
  121. }
  122. else if ((str[i] == 'i' || str[i] == 'I') && tempam == 6) // если 5я буква - t,
  123. {
  124. st = STATE_FUNCTION;// то в новое состояние
  125. answer += str[i];
  126. tempam++;
  127. i++; // берем следующую букву
  128. }
  129. else if ((str[i] == 'o' || str[i] == 'O') && tempam == 7) // если 5я буква - t,
  130. {
  131. st = STATE_FUNCTION;// то в новое состояние
  132. answer += str[i];
  133. tempam++;
  134. i++; // берем следующую букву
  135. }
  136. else if ((str[i] == 'n' || str[i] == 'N') && tempam == 8) // если 5я буква - t,
  137. {
  138. st = STATE_SPACE;// то в новое состояние
  139. answer += str[i];
  140. tempam = 2;
  141. i++; // берем следующую букву
  142. }
  143. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; } // при любых несоответствиях - в состояние ошибки
  144. }break;
  145. case STATE_SPACE: // если ТРЕТЬЕ
  146. switch (str[i]) // смотрим символ
  147. {
  148. case '\n': flag = false; break;
  149. case '\r': flag = false; break;
  150. case ' ': st = STATE_SPACE; answer += str[i]; while (str[i] == ' ') { i++; } break;// если пробел - то переходим в след. состояние, пропустив все пробелы
  151. default: if ((str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= '0'&&str[i] <= '9') || str[i] == '_') { st = STATE_NAME; }
  152. else { flag = false; st = STATE_NAME; } break; // иначе - в состояние ошибки
  153. }break;
  154. case STATE_NAME: // если ЧЕТВЕРТОЕ
  155.  
  156.  
  157. if ((str[i]<'0' || str[i]>'9'))
  158. {
  159.  
  160.  
  161. curr = "";
  162. while ((str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= '0'&&str[i] <= '9') || str[i] == '_') // пока допустимые символы
  163. {
  164. curr += str[i]; // складываем в curr
  165. i++;
  166. }
  167. if (!isoperator(curr)) { st = STATE_BRACKETS; answer += curr; } // если не зарезервированное слово, то в след. состояние
  168. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// иначе выход
  169. }
  170. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// если первая цифра - выход
  171. break;
  172. case STATE_BRACKETS:// если ПЯТОЕ
  173. switch (str[i]) // смотрим символ
  174. {
  175. case ' ': st = STATE_BRACKETS; answer += str[i]; while (str[i] == ' ') i++; break; // пропуск пробелов
  176. case '(': st = STATE_BRACKETS; brackets++; answer += str[i]; i++; break; // если знак = то в след. состояние
  177. case ')': st = STATE_TWO_POINTS; if (brackets) { answer += str[i]; i++; brackets--; }
  178. else { st = STATE_ERROR, answer = "" ; st = STATE_START;
  179. } break; // если знак = то в след. состояние
  180. default: st = STATE_ERROR; answer = ""; st = STATE_START; break; // иначе - в код ошибки
  181. }break;
  182. case STATE_TYPE: if ((str[i]<'0' || str[i]>'9'))
  183. {
  184. if (str[i] == ' ') answer += str[i];
  185. while (str[i] == ' ') i++;
  186. curr = "";
  187. while ((str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= '0'&&str[i] <= '9') || str[i] == '_') // пока допустимые символы
  188. {
  189. curr += str[i]; // складываем в curr
  190. i++;
  191. }
  192. if (istype(curr)) { st = STATE_ENDING; answer += curr; } // если не зарезервированное слово, то в след. состояние
  193. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// иначе выход
  194. }
  195. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// если первая цифра - выход
  196. break;
  197. case STATE_TWO_POINTS: // если ШЕСТОЕ
  198. if (str[i] == ' ')
  199. {
  200. answer += str[i];
  201. while (str[i] == ' ') i++;
  202. } //пропуск пробелов
  203. else if (str[i]==':') // допустимые значения
  204. {
  205. answer += str[i];
  206. st = STATE_TYPE; // то пошел финальный раунд
  207. i++; // следующий символ
  208. }
  209. else // недопустимые значения
  210. {
  211. st = STATE_ERROR; // код ошибки
  212. answer = "";
  213. st = STATE_START;
  214. }
  215. break;
  216. case STATE_ENDING: // если ПОСЛЕДНЕЕ
  217. switch (str[i]) // смотрим символ
  218. {
  219. case '\n': flag = false; break;
  220. case '\r': flag = false; break;
  221. case ' ': st = STATE_ENDING; answer += str[i]; while (str[i] == ' ') i++; break;
  222. case ';': answer += str[i]; found = true; break; // если точка с запятой, то флаг в положение найдено
  223. default: answer = ""; break; // иначе - выход
  224. }break;
  225. }
  226. if (found) // если найдена константа, отвечающая всем параметрам
  227. {
  228. cout << answer << endl; //то вывести ее
  229. answer = "";
  230. st = STATE_START;
  231. i++;
  232. found = false; // был ли ответ
  233. }
  234. }
  235.  
  236. }
  237. }
  238. fin.close(); // обязательно закрываем файл что бы не повредить его
  239. }
  240.  
  241. int main()
  242. {
  243. setlocale(LC_ALL, "Russian");
  244. isconst();
  245. system("pause");
  246. return 0;
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement