Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.54 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_INT,
  36. STATE_SPACE,
  37. STATE_NAME,
  38. STATE_ENDING,
  39. STATE_ERROR
  40.  
  41.  
  42. };
  43. string getWay(string fileway) {
  44. cout << "\nВведите путь к файлу: (../filename.txt)" << endl;
  45. cin >> fileway;
  46. cout << endl;
  47. return fileway;
  48. }
  49. void isconst()
  50. {
  51. States st = STATE_START; // СОСТОЯНИЕ 1
  52. string curr = "", answer = "";
  53. string fileway = "";
  54. fileway = getWay(fileway);
  55. ifstream fin("in.txt"); // файл из которого читаем
  56. if (!fin.is_open()) {
  57. cout << "Файл не найден!\n";
  58. isconst();
  59. }
  60. else {
  61. while (!fin.eof()) // пока не конец файла
  62. {
  63. string str;
  64.  
  65. getline(fin, str); //берем строку
  66. int i = 0;
  67.  
  68. int tempam = 2, brackets = 0; // счетчик, меняющийся от 2 до 5 (int содержит 5 букв, будет запускаться, когда 1я уже С, со 2й - проверяет)
  69. bool flag = true;
  70. bool found = false; // был ли ответ
  71. // конкретный
  72.  
  73. while (flag) // пока все нормально
  74. {
  75. switch (st) // смотрим состояния:
  76. {
  77. case STATE_START: // если ПЕРВОЕ
  78. {
  79. switch (str[i]) // смотрим на введенный символ
  80. {
  81. case ' ':st = STATE_START; i++; break; // если пробел, то пропускаем пробелы
  82. case 'i': st = STATE_INT; answer += str[i]; i++; break; // если буква с, то в состояние 2
  83. case 'I': st = STATE_INT; answer += str[i]; i++; break; // аналог для заглавной буквы
  84. default: answer = ""; flag = false; st = STATE_START; break; // иначе (недопустимый символ) - в состояние ошибки
  85. } break;
  86.  
  87. }break;
  88. case STATE_INT: // если ВТОРОЕ
  89. {
  90. if ((str[i] == 'n' || str[i] == 'N') && tempam == 2) // если 2я буква - n,
  91. {
  92. st = STATE_INT; // то остаемся в этом состоянии
  93. answer += str[i];
  94. i++; // берем следующую букву
  95. tempam++; // сравнивать будем уже с 3ей буквой слова const
  96. }
  97. else if ((str[i] == 't' || str[i] == 'T') && tempam == 3) // если 5я буква - t,
  98. {
  99. st = STATE_SPACE;// то в новое состояние
  100. answer += str[i];
  101. tempam = 2;
  102. i++; // берем следующую букву
  103. }
  104. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; } // при любых несоответствиях - в состояние ошибки
  105. }break;
  106. case STATE_SPACE: // если ТРЕТЬЕ
  107. switch (str[i]) // смотрим символ
  108. {
  109. case '\n': flag = false; break;
  110. case '\r': flag = false; break;
  111. case ' ': st = STATE_SPACE; answer += str[i]; while (str[i] == ' ') { i++; } break;// если пробел - то переходим в след. состояние, пропустив все пробелы
  112. 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; }
  113. else { flag = false; st = STATE_NAME; } break; // иначе - в состояние ошибки
  114. }break;
  115. case STATE_NAME: // если ЧЕТВЕРТОЕ
  116.  
  117.  
  118. if ((str[i]<'0' || str[i]>'9'))
  119. {
  120.  
  121.  
  122. curr = "";
  123. while ((str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= '0'&&str[i] <= '9') || str[i] == '_') // пока допустимые символы
  124. {
  125. curr += str[i]; // складываем в curr
  126. i++;
  127. }
  128. if (!isoperator(curr)) { st = STATE_ENDING; answer += curr; } // если не зарезервированное слово, то в след. состояние
  129. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// иначе выход
  130. }
  131. else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// если первая цифра - выход
  132. break;
  133. case STATE_ENDING: // если ПОСЛЕДНЕЕ
  134. switch (str[i]) // смотрим символ
  135. {
  136. case '\n': flag = false; break;
  137. case '\r': flag = false; break;
  138. case ' ': st = STATE_ENDING; answer += str[i]; while (str[i] == ' ') i++; break;
  139. case ';': answer += str[i]; found = true; break; // если точка с запятой, то флаг в положение найдено
  140. default: answer = ""; break; // иначе - выход
  141. }break;
  142. }
  143. if (found) // если найдена константа, отвечающая всем параметрам
  144. {
  145. cout << answer << endl; //то вывести ее
  146. answer = "";
  147. st = STATE_START;
  148. i++;
  149. found = false; // был ли ответ
  150. }
  151. }
  152.  
  153. }
  154. }
  155. fin.close(); // обязательно закрываем файл что бы не повредить его
  156. }
  157.  
  158. int main()
  159. {
  160. setlocale(LC_ALL, "Russian");
  161. isconst();
  162. system("pause");
  163. return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement