/*
说明:
输入格式:
每行输入一个产生式,左部右部中间的→用空格代替。
非终结符等价于大写字母
^ 表示 空
输入到文件结束,或用 0 0 结尾。
Sample Input:
(习题5·3):
S MH
S a
H LSo
H ^
K dML
K ^
L eHf
M K
M bLM
0 0
*/
#include
#include
#include
r> &follow) //求单个元素的 FOLLOW集
{
if(!capL(ch))
return;
for(vector::iterator iter=rightSide.begin(); iter!=rightSide.end(); ++iter) {
for(int i=0; i<(*iter).size(); i++) {
if(ch==(*iter)[i] && i!=(*iter).size()-1) {
if(!capL((*iter)[i+1])) {
follow.insert((*iter)[i+1]);
}
else {
getFirst((*iter)[i+1], follow);
}
}
if(ch==(*iter)[i] && i==(*iter).size()-1) { //判断是否是右部的最后一个非终结符 follow +#
follow.insert('#');
}
else if(ch==(*iter)[i] && i<(*iter).size()-1){ //不是最后一个 但之后全是非终结符且都能推出空 follow +#
bool flag1=true;
for(int j=i+1;j<(*iter).size(); j++) {
if(!capL((*iter)[j]) || toEmpty[(*iter)[j]]==false) {
flag1 = false;
if(!capL((*iter)[j])) {
follow.insert((*iter)[j]);
}
break;
}
}
if(flag1 == true) {
follow.insert('#');
}
}
}
if(isLast(*iter, ch)) { //ch是*iter的最后一个符号(直接或间接)
int n = senRever.count(*iter);
multimap::iterator mIter = senRever.find(*iter);
for(int i=0 ;iif(mIter->second!=ch )
getFollow(mIter->second, follow);
}
}
}
}
int main()
{
int cnt=0;
while(cin>>l>>r) {
if(cnt==0) {
Begin = l;
cnt++;
}
if(l=='0')
break;
sentence.insert(make_pair(l, r)); //产生式
senRever.insert(make_pair(r,l));
ter.insert(l); //非终结符集合(左部)
rightSide.push_back(r); //右部的集合
/* if(r=="^") { // 判断是否有 非终结符->^
toEmpty[l] = true;
}
else {
if(toEmpty.find(l)==toEmpty.end()) {
toEmpty[l] = false;
}
} */
}
for(set::iterator sIter = ter.begin(); sIter!=ter.end(); ++sIter) { // 判断是否有 非终结符->^
if(isToEmpty(*sIter) ) {
toEmpty[*sIter] = true;
}
else {
toEmpty[*sIter] = false;
}
}
for(set::iterator iter=ter.begin(); iter!=ter.end(); iter++) {
flag = false;
cout<<*iter<<" FIRST集 :";
fir.clear();
getFirst(*iter, fir);
for(set::iterator iterF=fir.begin(); iterF!=fir.end(); iterF++) {
cout<<" "<<*iterF;
}
cout<
follow.clear();
getFollow(*iter, follow);
cout<<" FOLLOW集:";
if(*iter==Begin) {
cout<<" #";
}
for(set::iterator iterF=follow.begin(); iterF!=follow.end(); ++iterF) {
if(*iterF!='^')
cout<<" "<<*iterF;
}
cout<
}
system("pause");
return 0;
}