Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <set>
- #include <string> // подключаем строки
- #include <fstream> // подключаем файлы
- using namespace std; // используем стандартное пространство имен
- bool isoperator(string curr) // проверка на зарезервированные слова
- {
- bool is = false; // вывод (по умолчанию значение false, т.е. "введенное слово не является зарезервированным")
- set<string> S; // задаем множество строкового типа (все элементы - слова) для этих зарезерварованны
- string s = "";
- ifstream file("operators.txt"); //открыть
- while (getline(file, s)) // пока в файле есть зарезервированные имена
- S.insert(s); // добавлять их в множество отдельными элементами
- if (S.count(curr) != 0) is = true; // проверка: если curr - есть зарезервированное
- file.close();
- return is;
- }
- bool istype(string curr) // проверка на зарезервированные слова
- {
- bool is = false; // вывод (по умолчанию значение false, т.е. "введенное слово не является зарезервированным")
- set<string> S; // задаем множество строкового типа (все элементы - слова) для этих зарезерварованны
- string s = "";
- ifstream file("types.txt"); //открыть
- while (getline(file, s)) // пока в файле есть зарезервированные имена
- S.insert(s); // добавлять их в множество отдельными элементами
- if (S.count(curr) != 0) is = true; // проверка: если curr - есть зарезервированное
- file.close();
- return is;
- }
- enum States { // список состояний
- STATE_START,
- STATE_INT,
- STATE_SPACE,
- STATE_NAME,
- STATE_ENDING,
- STATE_ERROR
- };
- string getWay(string fileway) {
- cout << "\nВведите путь к файлу: (../filename.txt)" << endl;
- cin >> fileway;
- cout << endl;
- return fileway;
- }
- void isconst()
- {
- States st = STATE_START; // СОСТОЯНИЕ 1
- string curr = "", answer = "";
- string fileway = "";
- fileway = getWay(fileway);
- ifstream fin("in.txt"); // файл из которого читаем
- if (!fin.is_open()) {
- cout << "Файл не найден!\n";
- isconst();
- }
- else {
- while (!fin.eof()) // пока не конец файла
- {
- string str;
- getline(fin, str); //берем строку
- int i = 0;
- int tempam = 2, brackets = 0; // счетчик, меняющийся от 2 до 5 (int содержит 5 букв, будет запускаться, когда 1я уже С, со 2й - проверяет)
- bool flag = true;
- bool found = false; // был ли ответ
- // конкретный
- while (flag) // пока все нормально
- {
- switch (st) // смотрим состояния:
- {
- case STATE_START: // если ПЕРВОЕ
- {
- switch (str[i]) // смотрим на введенный символ
- {
- case ' ':st = STATE_START; i++; break; // если пробел, то пропускаем пробелы
- case 'i': st = STATE_INT; answer += str[i]; i++; break; // если буква с, то в состояние 2
- case 'I': st = STATE_INT; answer += str[i]; i++; break; // аналог для заглавной буквы
- default: answer = ""; flag = false; st = STATE_START; break; // иначе (недопустимый символ) - в состояние ошибки
- } break;
- }break;
- case STATE_INT: // если ВТОРОЕ
- {
- if ((str[i] == 'n' || str[i] == 'N') && tempam == 2) // если 2я буква - n,
- {
- st = STATE_INT; // то остаемся в этом состоянии
- answer += str[i];
- i++; // берем следующую букву
- tempam++; // сравнивать будем уже с 3ей буквой слова const
- }
- else if ((str[i] == 't' || str[i] == 'T') && tempam == 3) // если 5я буква - t,
- {
- st = STATE_SPACE;// то в новое состояние
- answer += str[i];
- tempam = 2;
- i++; // берем следующую букву
- }
- else { st = STATE_ERROR; answer = ""; st = STATE_START; break; } // при любых несоответствиях - в состояние ошибки
- }break;
- case STATE_SPACE: // если ТРЕТЬЕ
- switch (str[i]) // смотрим символ
- {
- case '\n': flag = false; break;
- case '\r': flag = false; break;
- case ' ': st = STATE_SPACE; answer += str[i]; while (str[i] == ' ') { i++; } break;// если пробел - то переходим в след. состояние, пропустив все пробелы
- 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; }
- else { flag = false; st = STATE_NAME; } break; // иначе - в состояние ошибки
- }break;
- case STATE_NAME: // если ЧЕТВЕРТОЕ
- if ((str[i]<'0' || str[i]>'9'))
- {
- curr = "";
- while ((str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= '0'&&str[i] <= '9') || str[i] == '_') // пока допустимые символы
- {
- curr += str[i]; // складываем в curr
- i++;
- }
- if (!isoperator(curr)) { st = STATE_ENDING; answer += curr; } // если не зарезервированное слово, то в след. состояние
- else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// иначе выход
- }
- else { st = STATE_ERROR; answer = ""; st = STATE_START; break; }// если первая цифра - выход
- break;
- case STATE_ENDING: // если ПОСЛЕДНЕЕ
- switch (str[i]) // смотрим символ
- {
- case '\n': flag = false; break;
- case '\r': flag = false; break;
- case ' ': st = STATE_ENDING; answer += str[i]; while (str[i] == ' ') i++; break;
- case ';': answer += str[i]; found = true; break; // если точка с запятой, то флаг в положение найдено
- default: answer = ""; break; // иначе - выход
- }break;
- }
- if (found) // если найдена константа, отвечающая всем параметрам
- {
- cout << answer << endl; //то вывести ее
- answer = "";
- st = STATE_START;
- i++;
- found = false; // был ли ответ
- }
- }
- }
- }
- fin.close(); // обязательно закрываем файл что бы не повредить его
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- isconst();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement