Advertisement
Riz1Ahmed

Left Factoring (Compiler Design)

Dec 18th, 2019
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. ///Tested inputs:
  5. ///E->ABCd|ABC|ABCEF
  6. ///E->ABCd|ABCK|ABCEF
  7. ///A->def|defgh|dfa
  8. ///X->abc|def
  9.  
  10. int main(){
  11.     int i,j,mn=1e9;
  12.     string String;
  13.     puts("Input a Grammar like E->ABCd|ABC|ABCEF\n");
  14.     cin>>String;
  15.     String+='|';
  16.     char nont=String[0];
  17.     vector<string> States;
  18.  
  19.     ///Separate the states.
  20.     for (i=3; i<String.size(); i++){
  21.         string sate="";
  22.         while(String[i]!='|')
  23.             sate+=String[i], i++;
  24.  
  25.         States.push_back(sate);
  26.         mn=min(mn,int(sate.size()));
  27.     }
  28.  
  29.     ///Find Common string
  30.     int Common,f=0;
  31.     for (Common=0; Common<mn; Common++){
  32.         char c=States[0][Common];
  33.         for (j=0; j<States.size(); j++){
  34.             if (States[j][Common]!=c){
  35.                 f=1;
  36.                 break;
  37.             }
  38.         }
  39.         if (f) break;
  40.     }
  41.     Common--;
  42.     if (Common==-1) puts("Left factor is impossible for this grammar");
  43.     else{
  44.         printf("%c->",nont);
  45.         for (i=0; i<=Common; i++)
  46.             printf("%c",States[0][i]);
  47.         printf("%c'\n",nont);
  48.  
  49.         printf("%c'->",nont);
  50.         for (i=0; i<States.size(); i++){
  51.             for (j=Common+1; j<States[i].size(); j++)
  52.                 printf("%c",States[i][j]);
  53.             if (States[i].size()!=Common+1)
  54.                 printf("|");
  55.         }
  56.         puts("epsilon");
  57.     }
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement