Skip to content

Instantly share code, notes, and snippets.

@dlbas
Created March 17, 2019 17:54
Show Gist options
  • Save dlbas/a130502d9cbc0468cfe7a83e1fc64abc to your computer and use it in GitHub Desktop.
Save dlbas/a130502d9cbc0468cfe7a83e1fc64abc to your computer and use it in GitHub Desktop.
regex c++
#include <iostream>
#include <string>
#include <set>
#include <stdio.h>
using namespace std;
bool FSM(char ch, int &S) {
switch (S) {
case 0:
if (ch == 'd') {
S = 1;
return false;
}
cout << ch << " " << S << endl;
S = -1;
return true;
case 1:
if (ch == 'o') {
S = 2;
return false;
}
cout << ch << " " << S << endl;
S = -1;
return true;
case 2:
if (ch == ' ') {
S = 3;
return false;
}
cout << ch << " " << S << endl;
S = -1;
return true;
case 3:
if (ch == 'u') {
S = 4;
return false;
}
cout << ch << " " << S << endl;
S = -1;
return true;
case 4:
if (ch == 'n') {
S = 5;
return false;
}
cout << ch << " " << S << endl;
S = -1;
return true;
case 5:
if (ch == 't') {
S = 6;
return false;
}
cout << ch << endl;
S = -1;
return true;
case 6:
if (ch == 'i') {
S = 7;
return false;
}
cout << ch << endl;
S = -1;
return true;
case 7:
if (ch == 'l') {
S = 8;
return false;
}
cout << ch << endl;
S = -1;
return true;
case 8:
if (ch == ' ') {
S = 9;
return false;
}
cout << ch << endl;
S = -1;
return true;
case 9:
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
S = 10;
return false;
}
cout << ch << endl;
S = -1;
return true;
case 10:
if (
(ch >= 'A' && ch <= 'Z') ||
(ch >= 'a' && ch <= 'z') ||
(ch >= '0' && ch <= '9')) {
S = 10;
return false;
}
if (ch == '=') {
S = 11;
return false;
} if (ch == '<') {
S = 10;
return false;
} if (ch == '>') {
S = 11;
return false;
}
S = -1;
return true;
case 11:
if (ch >= '0' && ch <= '9') {
S = 12;
return false;
}
S = -1;
return true;
case 12:
if (ch >= '0' && ch <= '9') {
S = 12;
return false;
}
if (ch == ' ') {
S = 13;
return false;
}
S = -1;
return true;
case 13:
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
S = 14;
return false;
}
S = -1;
return true;
case 14:
if (
(ch >= 'A' && ch <= 'Z') ||
(ch >= 'a' && ch <= 'z') ||
(ch >= '0' && ch <= '9')) {
S = 14;
return false;
}
if (ch == '=') {
S = 15;
return false;
}
S = -1;
return true;
case 15:
if (ch >= '0' && ch <= '9') {
S = 16;
return false;
}
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
S = 17;
return false;
}
S = -1;
return true;
case 16:
if (ch >= '0' && ch <= '9') {
S = 16;
return false;
}
if (ch == '+' || ch == '*' || ch == '-' || ch == '/') {
S = 18;
return false;
}
S = -1;
return true;
case 17:
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
S = 17;
return false;
}
if (ch == '+' || ch == '*' || ch == '-' || ch == '/') {
S = 18;
return false;
}
S = -1;
return true;
case 18:
if (ch == ' ') {
S = 19;
return false;
}
S = -1;
return true;
case 19:
if (ch == 'l') {
S = 20;
return false;
}
S = -1;
return true;
case 20:
if (ch == 'o') {
S = 21;
return false;
}
S = -1;
return true;
case 21:
if (ch == 'o') {
S = 22;
return false;
}
S = -1;
return true;
case 22:
if (ch == 'p') {
S = 23;
return false;
}
S = -1;
return true;
case 23:
break;
}
}
int main() {
int S = 0;
string str;
int Final = 23; // Множество конечных состояний автомата
bool FEnter = false;
while (getline(cin, str), str != "") {
if (!FEnter)
FEnter = true;
else
FSM('\n', S);
for (auto i : str)
if (FSM(i, S))
break;
}
cout << S << endl;
if (S == Final) // Проверяем, находится ли автомат в конечном состоянии
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment