Advertisement
Coder_22

NFA

Jan 3rd, 2025
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void And(auto &v) {
  4.     int n = 4; map<pair<int, string>, vector<int>> st;
  5.     for (int i = 0; i < n; ++i) st[{i, v[0]}].push_back(i);
  6.     st[{0, v[1]}].push_back(1); st[{1, v[0]}].push_back(2);
  7.     st[{2, v[2]}].push_back(3); cout << "State\t" << v[0]
  8.     << '\t'<< v[1] << '\t' << v[2] << '\n';
  9.     for (int i = 0; i < n; ++i) {
  10.         if (!i) cout << "->";
  11.         else if(i == n-1) cout << "*"; cout << i << '\t';
  12.         for (auto e : v) {
  13.             if (st.find({i, e}) != st.end()) {
  14.                 for (auto ee : st[{i, e}])
  15.                     cout << ee << ' '; cout << '\t';
  16.             }
  17.             else cout << '-' << '\t';
  18.         }
  19.         cout << '\n';
  20.     }
  21. }
  22. void Or(auto &v) {
  23.     int n = 6; map<pair<int, string>, vector<int> > st;
  24.     for (int i = 0; i < n; ++i) st[{i, v[0]}].push_back(i);
  25.     st[{0, v[0]}].push_back(1); st[{0, v[0]}].push_back(2);
  26.     st[{1, v[1]}].push_back(3); st[{2, v[2]}].push_back(4);
  27.     st[{3, v[0]}].push_back(5); st[{4, v[0]}].push_back(5);
  28.     cout << "State\t" << v[0] << '\t' << v[1] << '\t'
  29.     << v[2] << '\n';
  30.     for (int i = 0; i < n; ++i) {
  31.         if (!i) cout << "->";
  32.         else if(i==n-1) cout << "*"; cout << i << '\t';
  33.         for (auto e : v) {
  34.             if (st.find({i, e}) != st.end()) {
  35.                 for (auto ee : st[{i, e}])
  36.                     cout << ee << ' '; cout << '\t';
  37.             }
  38.             else cout << '-' << '\t';
  39.         }
  40.         cout << '\n';
  41.     }
  42. }
  43. void Star(auto &v) {
  44.     int n = 4; map<pair<int, string>, vector<int> > st;
  45.     for (int i = 0; i < n; ++i) st[{i, v[0]}].push_back(i);
  46.     st[{0, v[0]}].push_back(1); st[{0, v[0]}].push_back(3);
  47.     st[{1, v[1]}].push_back(2); st[{2, v[0]}].push_back(3);
  48.     st[{2, v[0]}].push_back(1);
  49.     cout << "State\t" << v[0] << '\t'<< v[1] << '\n';
  50.     for (int i = 0; i < n; ++i) {
  51.         if (!i) cout << "->";
  52.         else if(i==n-1) cout << "*"; cout << i << '\t';
  53.         for (auto e : v) {
  54.             if (st.find({i, e}) != st.end()) {
  55.                 for (auto ee : st[{i, e}])
  56.                     cout << ee << ' '; cout << '\t';
  57.             }
  58.             else cout << '-' << '\t';
  59.         }
  60.         cout << '\n';
  61.     }
  62. }
  63. void Self(auto &v) {
  64.     int n = 3; map<pair<int, string>, vector<int> > st;
  65.     for (int i = 0; i < n; ++i) st[{i, v[0]}].push_back(i);
  66.     st[{0, v[0]}].push_back(1); st[{1, v[1]}].push_back(2);
  67.     cout << "State\t" << v[0] << '\t'<< v[1] << '\n';
  68.     for (int i = 0; i < n; ++i) {
  69.         if (!i) cout << "->";
  70.         else if(i==n-1) cout << "*"; cout << i << '\t';
  71.         for (auto e : v) {
  72.             if (st.find({i, e}) != st.end()) {
  73.                 for (auto ee : st[{i, e}])
  74.                     cout << ee << ' '; cout << '\t';
  75.             }
  76.             else cout << '-' << '\t';
  77.         }
  78.         cout << '\n';
  79.     }
  80. }
  81. auto var(auto &s) {
  82.     vector<string> v{"eps"};
  83.     for(int i = 0; i < s.size(); ++i) {
  84.         if(s[i]>='a' && s[i]<='z') {
  85.             string r; r+=s[i]; v.push_back(r);
  86.         }
  87.     }
  88.     return v;
  89. }
  90. int main() {
  91.     cout << "Enter the number of expressions: ";
  92.     int t; cin >> t;
  93.     while (t--) {
  94.         cout<<"Enter the expression: "; string s; cin>>s;
  95.         if((s.size() == 3 && s[1] == '.') or (s.size()==2
  96.         && s[1]!='*')) {
  97.             vector<string> v = var(s); And(v);
  98.         }
  99.         else if(s.size() == 3 && s[1] == '|') {
  100.             vector<string> v = var(s); Or(v);
  101.         }
  102.         else if(s.size() == 2 && s[1] == '*') {
  103.             vector<string> v = var(s); Star(v);
  104.         }
  105.         else if(s.size() == 1 && s.front() >= 'a'
  106.         && s.front() <= 'z') {
  107.             vector<string> v = var(s); Self(v);
  108.         }
  109.         else cout << "Invalid expression!\n";
  110.         cout << '\n';
  111.     }
  112.     return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement