算符优先分析

  1 #include <cstdio>
  2 #include <set>
  3 #include <cstdlib>
  4 #include <cctype>
  5 #include <functional>
  6 #include <cmath>
  7 #include <cstring>
  8 #include <string>
  9 #include <queue>
 10 #include <stack>
 11 #include <iostream>
 12 #include <vector>
 13 #include <map>
 14 #include <algorithm>
 15 #define esp 1e-6
 16 using namespace std;
 17 const int maxn = 1e5 + 7, mod = 1e9 + 7;
 18 
 19 int prio_table[300][300];
 20 vector<char>VN;
 21 vector<char>VT;
 22 bool vis_VN[30];
 23 bool vis_VT[300];
 24 bool LL_flag=true;
 25 void init_visit()
 26 {
 27     for(int i=0;i<26;i++)
 28         vis_VN[i]=true;
 29     for(int i=0;i<300;i++)
 30         vis_VT[i]=true; 
 31         
 32     for(int i=0;i<300;i++)
 33         for(int j=0;j<300;j++)
 34         {
 35             prio_table[i][j]=-2;
 36         }  
 37 }
 38 
 39 map<char,vector<string> >mp;//用来存文法 
 40 
 41 bool is_VN(char x)//判断是否是非终结符 
 42 {
 43     if(x>='A'&&x<='Z')
 44         return true;
 45     else
 46         return false;
 47 }
 48 bool is_VT(char x)
 49 {
 50     return !is_VN(x);
 51 }
 52 
 53 set<char> FIRSTVT(char vnch)
 54 {
 55     set<char>ans;
 56     for(int i=0;i<mp[vnch].size();i++)
 57     {
 58         string s=mp[vnch][i];
 59         if(!is_VN(s[0]))
 60             ans.insert(s[0]);
 61         else
 62         {
 63             if(s.length()>1)
 64                 ans.insert(s[1]);
 65             if(s[0]!=vnch)
 66             {
 67                 set<char>ss=FIRSTVT(s[0]);
 68                 set<char>::iterator it;
 69                 for(it=ss.begin();it!=ss.end();it++)
 70                 {
 71                     ans.insert(*it);
 72                 }
 73             }
 74         }
 75     }
 76     return ans;    
 77 }
 78 
 79 set<char> LASTVT(char vnch)
 80 {
 81     set<char>ans;
 82     for(int i=0;i<mp[vnch].size();i++)
 83     {
 84         string s=mp[vnch][i];
 85         int s_end=s.length()-1;
 86         if(!is_VN(s[s_end]))
 87         {
 88             ans.insert(s[s_end]);
 89         }
 90         else
 91         {
 92             if(s_end>0)
 93                 ans.insert(s[s_end-1]);
 94             if(s[s_end]!=vnch)
 95             {
 96                 set<char>ss=LASTVT(s[s_end]);
 97                 set<char>::iterator it;
 98                 for(it=ss.begin();it!=ss.end();it++)
 99                 {
100                     ans.insert(*it);
101                 }
102             }
103         }
104     }
105     return ans;    
106 }
107 
108 
109 int main() {
110     init_visit(); 
111     int k=1;
112     char vn;
113     string str;
114     while(cin>>vn&&vn!='#'&&cin>>str)
115     {
116         if(vis_VN[vn-'A']==true)//不重复存vn 
117         {
118             VN.push_back(vn);
119             vis_VN[vn-'A']=false;
120         }        
121         mp[vn].push_back(str);//代表vn可以推导出str
122         for(int i=0;i<str.size();i++)
123         {
124             if(!is_VN(str[i])&&vis_VT[(int)str[i]]==true&&str[i]!='0')
125             {
126                 VT.push_back(str[i]);
127                 vis_VT[(int)str[i]]=false;
128             }
129         }  
130     }
131     VT.push_back('#');
132 //    sort(VT.begin(),VT.end()-1);
133 //    for(int i=0;i<VT.size();i++)
134 //    cout<<VT[i]<<" ";
135 
136     cout<<"FIRSTVT:"<<endl;
137     for(int i=0;i<VN.size();i++)
138     {
139         cout<<VN[i]<<" : ";
140         set<char>::iterator it;
141         set<char>ss=FIRSTVT(VN[i]);
142         for(it=ss.begin();it!=ss.end();it++)
143         {
144             cout<<(*it)<<"  ";
145         }
146         cout<<endl;    
147     }
148     
149     cout<<"LASTVT:"<<endl;
150     for(int i=0;i<VN.size();i++)
151     {
152         cout<<VN[i]<<" : ";
153         set<char>::iterator it;
154         set<char>ss=LASTVT(VN[i]);
155         for(it=ss.begin();it!=ss.end();it++)
156         {
157             cout<<(*it)<<"  ";
158         }
159         cout<<endl;    
160     }
161     
162     char chf='#';
163     set<char>::iterator itf;
164     set<char>ss1=FIRSTVT(VN[0]);
165     for(itf=ss1.begin();itf!=ss1.end();itf++)
166     {
167         prio_table[(int)chf][(*itf)]=-1;
168     }
169     set<char>ss2=LASTVT(VN[0]);
170     for(itf=ss2.begin();itf!=ss2.end();itf++)
171     {
172         
173         prio_table[(*itf)][(int)chf]=1;
174     }
175     prio_table[(int)chf][(int)chf]=0;
176     
177     
178     for(int i=0;i<VN.size();i++)
179     {
180         for(int j=0;j<mp[VN[i]].size();j++)
181         {
182             string s=mp[VN[i]][j];
183             for(int k=0;k<s.length();k++)
184             {
185                 if(is_VT(s[k])&&k+1<s.length()&&is_VT(s[k+1]))
186                     prio_table[s[k]][s[k+1]]=0;
187                 if(is_VT(s[k])&&k+2<s.length()&&is_VN(s[k+1])&&is_VT(s[k+2]))
188                     prio_table[s[k]][s[k+2]]=0;                    
189                 if(is_VT(s[k])&&k+1<s.length()&&is_VN(s[k+1]))
190                 {
191                     set<char>first=FIRSTVT(s[k+1]);
192                     set<char>::iterator it;
193                     for(it=first.begin();it!=first.end();it++)
194                     {
195                         prio_table[s[k]][(*it)]=-1;
196                     }
197                 }
198                 if(is_VN(s[k])&&k+1<s.length()&&is_VT(s[k+1]))
199                 {
200                     set<char>last=LASTVT(s[k]);
201                     set<char>::iterator it;
202                     for(it=last.begin();it!=last.end();it++)
203                     {
204                         prio_table[(*it)][s[k+1]]=1;
205                     }
206                 }
207             }
208         }
209     }
210     
211     cout<<"优先表如下:"<<endl; 
212     cout<<" ";
213     for(int i=0;i<VT.size();i++)
214     printf("%10c",VT[i]);
215     cout<<endl;
216     for(int i=0;i<VT.size();i++)
217     {
218         cout<<VT[i];
219         for(int j=0;j<VT.size();j++)
220         {
221             cout<<"         ";
222             if(prio_table[VT[i]][VT[j]]==1)
223                 cout<<">";
224             else if(prio_table[VT[i]][VT[j]]==0)
225                 cout<<"=";
226             else
227                 cout<<"<";
228         }
229         cout<<endl;
230     } 
231 
232     cout<<"input a string"<<endl;
233     string checkstr;
234     while(cin>>checkstr)
235     {
236         string stackstr="#";
237         checkstr+='#';
238         while(stackstr!="#N#")
239         {
240             cout<<stackstr<<"          "<<checkstr<<endl;
241             char ch=checkstr[0];
242             if(prio_table[ch][stackstr[stackstr.length()-1]]>=0||(is_VN(stackstr[stackstr.length()-1])&&prio_table[ch][stackstr[stackstr.length()-2]]>=0))
243             {
244                 stackstr+=ch;
245                 checkstr.erase(checkstr.begin());
246             }
247             else
248             {
249                 int strend=stackstr.length()-1;
250                 if(is_VN(stackstr[strend]))
251                 {
252                     strend--;
253                 }
254 //                if(prio_table[stackstr[strend]][stackstr[strend]]==-2)
255 //                {
256 //                    cout<<"error"<<endl;
257 //                    break;
258 //                }
259                 int j;
260                 for(j=strend-1;j>=0;j--)
261                 {
262                     if(is_VN(stackstr[j]))
263                         j--;
264                     if(prio_table[stackstr[j]][stackstr[strend]]<0)
265                     {
266                         break;
267                     }
268                 }
269                 stackstr.erase(stackstr.begin()+j+1,stackstr.end());
270                 stackstr+='N'; 
271                     
272             }
273         }
274         if(stackstr=="#N#")
275             cout<<"OK"<<endl;
276     }
277     
278     return 0;
279 }

猜你喜欢

转载自www.cnblogs.com/eastblue/p/9016954.html
今日推荐