//将该产生式左部非终结符的Follow集合 //加入到当前非终结符的Follow集合中.
//然后从当前终结符开始向右判断是否为非终结符,是的话,进行相应处理 //循环直到当前非终结符推不出ε或当前为终结符时退出 if(j==len-1) { t3=j; strcpy(ch,a[i]); while(!flag) { if((ch[t3]>='A')&&(ch[t3]<='Z')) { for(k=0;k break; } } break; } } } else break; } flag=0; } } //如果当前位为终结符,判断其前一位是否为非终结符 //是的话,将该终结符并到该非终结符的Follow集合中 else { if((a[i][j-1]>='A')&&(a[i][j-1]<='Z')) { for(k=0;k if(!fchange) { for(i=0;i } } } int main() { int i; if(input()==-1) return -1; seekEmpty(); seekFirstVn(); seekFirstRight(); seekFollow(); return 0; } 实验演示: 因为不知道怎么用电脑输出’ε’符号,我在代码里用’@’来表示 ‘ε’.以‘$’来结束输入 测试数据1: S->MH|a H->LSo|@ K->dML|@ L->eHf M->K|bLM 测试数据2: S->aH H->aMd|d M->Ab|@ A->aM|e 实验感想: 经过这几次的实验,不仅让我们更加深刻的知道了first集合和follow集合的计算步骤和方法,还很好的培养了我们动手能力。虽然这两个集合用笔算的方法很简单,但是要让计算机来演算就不是那么容易了,这需要设计合理的数据结构和算法才能正确地求出结果。当然在设计算法的时候难免会出现错误,这就需要我们这些程序员们仔细的去调试,发现错误并改正。本以为这次的实验代码不会很长,但是实际写好了却有好几百行,可能是我的算法不够好吧。总的来讲这次的实验没有遇到太大的问题,因为课上老师很认真的给我们讲解了它们的求法,笔推也做了好几次练习,让我们理清了思路。