for(i=0;i if(p[i].right.length() else //即不是0型文法 flag--;//flag=-1 if(flag>0) { cout< return 1; //属于1型文法 else return 0; } int two(Chomsky *p)//2型文法 { int flag(0); int i; if(one(p)) { for(i=0;i if((p[i].left.length()!=1)||!(p[i].left[0]>='A'&&p[i].left[0]<='Z')) //左部不属于一个字符或不属于非终结符 { flag++;//则不为2型 break; } } else//不为1型?flag=-1 flag--; if(flag>0) { cout< return 1; //属于2型文法 } else return 0; } int remove(Chomsky *p,int n)//消除左递归 {//把文法的所有非终结符按某一顺序排序 int i,j,count=1,count1=n,flag=0,m,x; q[0]=p[0].left[0]; for(i=1;i for(j=0;j if(p[i].left==p[j].left)break; } if(j==i)q[count++]=p[i].left[0]; } count--; for(i=0;i if(p[i].left[0]==q[0]&&p[i].left[0]==p[i].right[0]) flag++; if(flag!=0)//消除第一个非终结符的直接左递归 { for(i=0;i if(p[i].left[0]==q[0]) { if(p[i].left[0]==p[i].right[0]) { p[i].left=p[i].left+\ p[i].right=p[i].right.substr(1,p[i].right.length())+p[i].left; } else p[i].right=p[i].right+p[i].left+\ } } p[count1].left=p[0].left; p[count1++].right=\用#代替空产生式 } //消一切左递归 for(m=0;m<=count;m++) { for(i=0;i if(p[i].left[0]==q[m]) { for(j=0;j { for(x=m+1;x<=count;x++) if(p[j].left[0]==q[x]&&p[j].right[0]==q[m]) { p[count1].left=p[j].left; p[count1].right=p[i].right+p[j].right.substr(1,p[j].right.length()); count1=count1+1; } } } } for(j=0;j { for(x=m+1;x<=count;x++) if(p[j].right[0]==q[m]&&p[j].left[0]==q[x]) { p[j].right=\ p[j].left=\ } } for(x=0,flag=0;x if(p[x].left[0]==q[m]&&p[x].left[0]==p[x].right[0]) flag++; //消直接左递归 if(flag!=0) { for(i=0;i if(p[i].left[0]==q[m]) { if(p[i].left[0]==p[i].right[0]) { p[i].left=p[i].left+\
实验3:LL(1)文法构造(2)
2019-03-28 12:46
实验3:LL(1)文法构造(2).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!