logo资料库

计算first集和follow集.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
计算 first 集和 follow 集 #include #include using namespace std; struct G { string left; string right; }; int N; string str,VN,VT; void VNandVT(G *p){ VN=""; VT=""; int i,j; for(i=0;i='A' && p[i].left[j]<='Z')){ if(VN.find(p[i].left[j])>100) VN+=p[i].left[j]; } else if(VT.find(p[i].left[j])>100) VT+=p[i].left[j]; for(j=0;j<(int)p[i].right.length();j++) //分离又部 if((!(p[i].right[j]>='A' && p[i].right[j]<='Z'))){ if(VT.find(p[i].right[j])>100) VT+=p[i].right[j]; } else } } if(VN.find(p[i].right[j])>100) VN+=p[i].right[j]; void removeAll(char c,G *q,int &n){ //删除左部为 c 的所有产生式 int i,j; for(i=0;i
break; } for(j=i;j='a' && 'z'>=p[i].right[j]) if(j==p[i].right.length()){ break; p1[n]=p[i]; n++; } } for(i=0;i
int i; for(i=0;i100 && s2[i]!=c) s1+=s2[i]; void remove(G *p,int &n,int &i){ if(i!=n-1) for(int k=i;k=p[i].right[0]) || '#'==p[i].right[0]) adds(first[VN.find(p[i].left[0])],p[i].right,1); else {
p1[n]=p[i]; n++; } while(n) for(i=0;i=p1[i].right[0]){ adds(first[VN.find(p1[i].left[0])],p1[i].right,1); remove(p1,n,i); break; } if(!inP(p1,p1[i].right[0],n)){ adds(first[VN.find(p1[i].left[0])],first[VN.find(p1[i].right[0])], first[VN.find(p1[i].right[0])].length(),'#'); if(1==X[VN.find(p1[i].right[0])]){ p1[i].right.erase(0,1); if(0==p1[i].right.length()){ first[VN.find(p1[i].left[0])]+='#'; remove(p1,n,i); } } remove(p1,n,i); string firststring(string s,string *first,int *X){ //求字符串的 first 集 else } } } string s1; if(0==s.length()) return s1+='#'; for(int i=0;i=s[i]) return s1+=s[i]; else{ return s1; } return s1+='#'; } adds(s1,first[VN.find(s[i])],first[VN.find(s[i])].length(),'#'); if(-1==X[VN.find(s[i])]) bool isbig(int *a,string *follow){ for(int i=0;i
for(int j=0;j=p[i].right[j]){ string str0=p[i].right.substr(j+1,p[i].right.length()); string str1=firststring(str0,first,X); adds(follow[VN.find(p[i].right[j])],str1,str1.length(),'#'); if(str1.find('#')<100){ adds(follow[VN.find(p[i].right[j])],follow[VN.find(p[i].left[0])], follow[VN.find(p[i].left[0])].length()); } } } //得到文法 void get(G *p,int i){ int j; for(j=0;j'表示,'end'表示结束,'#' 表示空串):"<
cin>>in; for(i=0;i<50;i++){ if(!strcmp(in,"end")) break; srt[i]=in; N++; cin>>in; } for(i=0;i
分享到:
收藏