if(ch==a) {
cout<<\分析成功\ return 1; } else
return 0; } else
if(ch=='*') {
fenxi.erase(fenxi.length()-1,1); if(pipei(chuan,fenxi,yc,b)) return 1; else
return 0; } else {
i=NODE.find(ch); if(a=='#') {
x=ENODE.find('*');
if(x
j=ENODE.length(); } else
j=ENODE.find(a); if(yc[i][j].length()) {
cout<
if(pipei(chuan,fenxi,yc,b)) return 1; else
return 0; } else
return 0;
} } }
void main() {
edge *n;
string str,(*yc)[50]; int i,j,k; bool flag=0;
cout<<\请输入上下文无关文法的总规则数:\cin>>SUM;
cout<<\请输入具体规则(格式:左部 右部,*为空):\n=new edge[SUM]; for(i=0;i for(j=0;j str=n[i].getrg(); if(NODE.find(str[j])>NODE.length()&&ENODE.find(str[j])>ENODE.length()) ENODE+=str[j]; } //计算first集合 for(i=0;i first(n[i],n,i); /* cout<<\ out(n[i].getfirst()); cout< //outfu(10,\for(i=0;i if(n[i].getfirst().find(\ { if(NODE.find(n[i].getro()) for(k=1;k if(NODE.find(n[i].getrg()[k]) for(j=0;j if(n[i].getrg()[k]==n[j].getlf()[0]) { n[i].newfirst(n[j].getfirst()); break; } } if(n[j].getfirst().find(\ { n[i].delfirst(); break; } } } } } /* for(i=0;i cout<<\ out(n[i].getfirst()); cout< outfu(10,\*/ //计算follow集合 for(k=0;k for(i=0;i if(n[i].getlf()==n[0].getlf()) n[i].newfollow(\ follow(n[i],n,i); } for(i=0;i for(j=0;j if(n[j].getrg().find(n[i].getlf())==n[j].getrlen()-1) n[i].newfollow(n[j].getfollow()); /* cout<<\ out(n[i].getfollow()); cout< } //outfu(10,\//计算select集合 for(i=0;i select(n[i],n); /* cout<<\ out(n[i].getselect()); cout< for(i=0;i str.erase(); for(j=0;j if(n[j].getlf()[0]==NODE[i]) { if(!str.length()) str=n[j].getselect(); else { for(k=0;k flag=1; break; } } } } /* for(i=0;i cout<<\ out(n[i].getselect()); cout< cout< cout<<\outfu(5+SUM,\cout< for(i=0;i for(j=0;j if(NODE[i]==n[j].getlf()[0]) { outfu(3,\ cout< outfu(SUM+4-2*n[j].getfirst().length(),\ out(n[j].getfollow()); cout< outfu(5+SUM,\ cout< cout<<\该文法不是LL(1)文法!\ return; } else { cout<<\该文法是LL(1)文法!\ } //输出预测分析表 cout< for(i=0;i for(j=0;j cout< string chuan,fenxi,fchuan;