Advertisement
Coder_22

Operator Precedence Parser

Jan 4th, 2025
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. char rel(string &s, string &r) {
  5.     if (s == "id" && r == "id") return '-';
  6.     if (s == "$" && r == "$") return 'A';
  7.     if (s == "id" || r == "$") return '>';
  8.     if (s == "$" || r == "id") return '<';
  9.     if (s == "+") {
  10.         if (r == "*" || r == "^") return '<';
  11.         return '>';
  12.     }
  13.     if (s == "*") {
  14.         if (r == "+" || r == "^") return '>';
  15.         return '<';
  16.     }
  17.     if (s == "^") {
  18.         if (r == "+" || r == "*") return '>';
  19.         return '<';
  20.     }
  21. }
  22.  
  23. int main() {
  24.     map<string, string> grammar;
  25.     grammar["E + E"] = grammar["E * E"] = grammar["E ^ E"] = grammar["id"] = "E";
  26.     cout << "Enter the production: ";
  27.     string s;
  28.     getline(cin, s);
  29.     vector<string> w;
  30.     string r;
  31.     for (char c : s) {
  32.         if (c == ' ') w.push_back(r), r.clear();
  33.         else r += c;
  34.     }
  35.     if (!r.empty()) w.push_back(r);
  36.     w.push_back("$");
  37.     int i = 0;
  38.     string ip = w[i];
  39.     stack<string> sk, terminal;
  40.     sk.push("$");
  41.     while (true) {
  42.         if (sk.top() == "$" && ip == "$" && terminal.size() == 1 && terminal.top() == grammar.begin()->second) {
  43.             cout << "Accepted!\n";
  44.             break;
  45.         }
  46.         string a = sk.top(), b = ip;
  47.         char relation = rel(a, b);
  48.         if (relation == '<') {
  49.             sk.push(b);
  50.             ip = w[++i];
  51.             cout << "Shift Operation Performed!\n";
  52.         }
  53.         else if (relation == '>') {
  54.             do {
  55.                 string recent = sk.top();
  56.                 sk.pop();
  57.                 if (recent != w[0]) {
  58.                     string st = terminal.top();
  59.                     terminal.pop();
  60.                     st += " " + recent + " " + terminal.top();
  61.                     terminal.pop();
  62.                     terminal.push(grammar[st]);
  63.                 }
  64.                 else terminal.push(grammar[w[0]);
  65.                 cout << "Reduce Operation Performed!\n";
  66.             } while (rel(sk.top(), ip) == '>');
  67.         }
  68.     }
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement