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
今日推荐
周排行