当前位置:文档之家› LL1 first follow集

LL1 first follow集

课程名称: LL1文法的判别年级/专业/班: 11级计算机类(二)班姓名: 徐勇兵学号: E01114278import java.util.Vector;import javax.swing.JOptionPane;class Tools{public Vector<String> protection(Vector<String> vs){Vector<String> newvector=new Vector<String>();for(int i=0;i<vs.size();i++)newvector.add(vs.get(i));return newvector;}public Vector<Vector<String>> doubleprotection(Vector<Vector<String>> vs){ Vector<Vector<String>> newvector=new Vector<Vector<String>>();for(int i=0;i<vs.size();i++){Vector<String> produce=(Vector<String>)vs.get(i);Vector<String> temp=new V ector<String>();for(int j=0;j<produce.size();j++){temp.add((String)produce.get(j));}//for jnewvector.add(temp);}//for ireturn newvector;}}class Elements{Vector<String> end=new V ector<String>();//表示终结符Vector<String> noend=new Vector<String>();//表示非终结符Vector<Vector<String>> produce=new Vector<Vector<String>>();//产生式public void setend(){//终结符元素添加while(true){String s=JOptionPane.showInputDialog(null,"请输入终结符");if(s==null){ return;}//ifend.add(s);}//while}//public void addend(){//元素添加public void setnoend(){//非终结符元素添加while(true){String s=JOptionPane.showInputDialog(null,"非请输入终结符");if(s==null){ return;}//ifnoend.add(s);}//while}//public void addnoend(){//public void setproduce(){while(true){String s=JOptionPane.showInputDialog(null,"请输入产生式,->隔开");if(s==null)return;Vector<String> temp=new Vector<String>();temp.add(s.split("->")[0]);temp.add(s.split("->")[1]);produce.add(temp);}//while}//public void addproduce()public Vector<String> getend(){return end;}public Vector<String> getnoend(){return noend;}public Vector<Vector<String>> getproduce(){return this.produce;}public void run(){/*************************TEST********************************/ end.add("a");end.add("b");end.add("c");end.add("e");noend.add("S");noend.add("A");noend.add("B");noend.add("C");noend.add("D");Vector<String> temp=new Vector<String>();temp.add("S");temp.add("AB");produce.add(temp);/*************************/Vector<String> temp1=new Vector<String>();temp1.add("S");temp1.add("bC");produce.add(temp1);/*************************/Vector<String> temp2=new Vector<String>();temp2.add("A");temp2.add("e");produce.add(temp2);/*************************/Vector<String> temp3=new Vector<String>();temp3.add("A");temp3.add("b");produce.add(temp3);/*************************/Vector<String> temp4=new Vector<String>();temp4.add("B");temp4.add("e");produce.add(temp4);/*************************/Vector<String> temp5=new Vector<String>();temp5.add("B");temp5.add("aD");produce.add(temp5);/*************************/Vector<String> temp6=new Vector<String>();temp6.add("C");temp6.add("AD");produce.add(temp6);/*************************/Vector<String> temp7=new Vector<String>();temp7.add("C");temp7.add("b");produce.add(temp7);/*************************/Vector<String> temp8=new Vector<String>();temp8.add("D");temp8.add("aS");produce.add(temp8);/*************************/Vector<String> temp9=new Vector<String>();temp9.add("D");temp9.add("c");produce.add(temp9);/*************************/// System.out.println("produce.size()="+produce.size());/***********************TEST**********************************///this.setend();//this.setnoend();//this.setproduce();}public boolean Iscontainend(String s)//正则表达式判断s1是否在END的闭包里面正则忘了怎么写了{int length=s.length();for(int i=0;i<length;i++){String a=""+s.charAt(i);if(end.contains(a))return true;else continue;}//forreturn false;}//public boolean isRGPcontain(String s)public boolean IsNoENd(String s){String ss=""+s.charAt(0);if(! Iscontainend(ss))//如果不含有终结符,则为非终结符return true;return false;}// public boolean}//class Elementsclass Follow{Vector<String> end=new V ector<String>();//表示终结符Vector<String> noend=new Vector<String>();//表示非终结符Vector<Vector<String>> produce=new Vector<Vector<String>>();//产生式Vector<Vector<String>> emptytable=new Vector<V ector<String>>();Elements elements;First first;Vector<Vector<String>> flagtable=new Vector<Vector<String>>();Vector<Vector<String>> followtable=new Vector<Vector<String>>();public void showfollowtable(){for(int i=0;i<followtable.size();i++){System.out.println();Vector<String> temp=followtable.get(i);System.out.print(temp.get(0)+"的Follow集:");for(int j=1;j<temp.size();j++){System.out.print(temp.get(j)+",");}}}//public void showfollowtable(){public Vector<String> getAppointfollow(String s){Vector<String> temp=new V ector<String>();for(int i=0;i<followtable.size();i++){temp=followtable.get(i);if(temp.get(0).equals(s))return temp;}//forreturn temp;}// public Vector<String> getAppointfollow(String s)public void init_flagtableAndfollowtable(){for(int i=0;i<noend.size();i++){Vector<String> temp=new V ector<String>();temp.add(noend.get(i));temp.add("no");flagtable.add(temp);}//forfor(int i=0;i<noend.size();i++){Vector<String> temp=new V ector<String>();temp.add(noend.get(i));followtable.add(temp);}//for}//public void init_flagtableAndfollowtablepublic void show_flagtableAndfollowtable(){System.out.println();System.out.println("flagtable is shown as follows:");for(int i=0;i<flagtable.size();i++){Vector<String> temp=flagtable.get(i);System.out.print(temp.get(0)+":"+temp.get(1));System.out.println();}//forSystem.out.println("followtable is shown as follows:");for(int i=0;i<followtable.size();i++){System.out.println();Vector<String> temp=followtable.get(i);System.out.print(temp.get(0)+":");for(int j=1;j<temp.size();j++){System.out.print(temp.get(j));}}//for}public String getFlagTable(String s){for(int i=0;i<flagtable.size();i++){Vector<String> temp=flagtable.get(i);if(temp.get(0).equals(s)){return temp.get(1);}}//forreturn "no";}// public String getFlagTable(String s)public void setFlagTable(String s){for(int i=0;i<flagtable.size();i++){Vector<String> temp=flagtable.get(i);if(temp.get(0).equals(s)){temp.set(1,"yes");}}//for}// public String setFlagTable(String s)public boolean Isindicateempty(String s){for(int i=0;i<emptytable.size();i++){Vector<String> temp=emptytable.get(i);if(temp.get(0).equals(s)){if(temp.get(1).equals("yes"))return true;elsereturn false;}//if 外层}//forreturn false;}// public boolean Isindicatefull(String s)public Vector<Vector<String>> getFirsrtandFollow(String s){//获得非终结符s的要加入的Follw(A)和First(a)的a和A//System.out.println("欲求"+s+"的相关信息");Vector<Vector<String>>vs=new Vector<Vector<String>>();Vector<String> first=new Vector<String>();Vector<String> follow=new Vector<String>();for(int i=0;i<produce.size();i++){Vector<String> temp=produce.get(i);String left=temp.get(0);String right=temp.get(1);//获取产生式的右部int index=right.indexOf(s);if(index!=(-1)){//如果右部含有次非终结符的话if(right.length()==(index+1)){//D->aS型(S为所求)follow.add(left);}else{String nextchar=""+right.charAt(index+1);first.add(nextchar);if(Isindicateempty(nextchar)){//如果此非终结符可以产生空的话follow.add(left);}}}//if(index!=(-1))}//for/*if(first.isEmpty()==false){//如果不空System.out.println(s+"firsr为:");for(int i=0;i<first.size();i++){System.out.println();String sb=(String)first.get(i);System.out.print(sb);}//for}else{//System.out.println(s+"的first为空");}if(follow.isEmpty()==false){//如果不空System.out.println();System.out.print(s+"的follow为:");for(int i=0;i<follow.size();i++){String sb=(String)follow.get(i);System.out.print(sb);}//for}else{//System.out.println(s+"的follow为空");}*/vs.add(first);vs.add(follow);return vs;}public Vector<String> addElements(Vector<String> vs,Vector<String>temp){ for(int i=0;i<temp.size();i++){if(!vs.contains(temp.get(i)))vs.add(temp.get(i));}//forreturn vs;}//public Vector<String> addElements(Vector<String> vs,Vector<String>temp){ public Vector<String> getFollow(String s){Vector<String> follow=getAppointfollow(s);//System.out.println(s+"的flagtable对应的是"+getFlagTable(s));if(getFlagTable(s).equals("yes")){/*System.out.println("返回follow集,防止死循环");System.out.println("返回follow集签先输出查看");for(int i=0;i<follow.size();i++){System.out.print(follow.get(i)+",");}System.out.println();*/Vector<String> kk=new V ector<String>();for(int i=1;i<follow.size();i++){kk.add(follow.get(i));}return kk;}setFlagTable(s);//将flagtable的对应表项置为yesString Start_Characrter="S";if(s.equals(Start_Characrter)){//System.out.println("follow加入了#");follow.add("#");}Vector<Vector<String>> vs=getFirsrtandFollow(s);//show_flagtableAndfollowtable();Vector<String> firstcharacter=vs.get(0);Vector<String> followcharacter=vs.get(1);System.out.println();//System.out.println("111111111111111111");if(firstcharacter.isEmpty()==false){//如果不空for(int i=0;i<firstcharacter.size();i++){String sb=(String)firstcharacter.get(i);Vector<String> vv= first.getFirst(sb);follow=addElements(follow,vv);}//for}if(followcharacter.isEmpty()==false){//如果不空for(int i=0;i<followcharacter.size();i++){String sb=(String)followcharacter.get(i);Vector<String> vv= getFollow(sb);follow=addElements(follow,vv);}//for}follow.remove("e");Vector<String> kk=new V ector<String>();for(int i=1;i<follow.size();i++){kk.add(follow.get(i));}//return follow;return kk;}public Follow(Elements _elements,Vector<Vector<String>> _emptytable,First _first){ this.elements=_elements;this.emptytable=_emptytable;this.first=_first;this.end=elements.getend();this.noend=elements.getnoend();this.produce=elements.getproduce();init_flagtableAndfollowtable();}}//class followclass First{Vector<String> end=new V ector<String>();//表示终结符Vector<String> noend=new Vector<String>();//表示非终结符Vector<Vector<String>> produce=new Vector<Vector<String>>();//产生式Vector<Vector<String>> emptytable=new Vector<V ector<String>>();Elements elements;public First(Elements _elements,Vector<Vector<String>> _emptytable){ this.elements=_elements;this.emptytable=_emptytable;this.end=elements.getend();this.noend=elements.getnoend();this.produce=elements.getproduce();}public Vector<String> getRight(String left){Vector<String> right=new Vector<String>();for(int i=0;i<produce.size();i++){Vector<String>temp=produce.get(i);if(temp.get(0).equals(left)){right.add(temp.get(1));}}//forreturn right;}//public String[] getRight(String left)public Vector<String> addElements(Vector<String> vs,Vector<String>temp){ for(int i=0;i<temp.size();i++){if(!vs.contains(temp.get(i)))vs.add(temp.get(i));}//forreturn vs;}//public Vector<String> addElements(Vector<String> vs,Vector<String>temp){ public boolean Isindicateempty(String s){for(int i=0;i<emptytable.size();i++){Vector<String> temp=emptytable.get(i);if(temp.get(0).equals(s)){if(temp.get(1).equals("yes"))return true;elsereturn false;}//if 外层}//forreturn false;}// public boolean Isindicatefull(String s)public boolean IsNoENd(String s){String ss=""+s.charAt(0);if(! elements.Iscontainend(ss))//如果不含有终结符,则为非终结符return true;return false;}// public booleanpublic boolean IsStartWithEnd(String s){//判断是否以终结符开头String ss=""+s.charAt(0);if( elements.Iscontainend(ss))return true;return false;}public Vector<String> getFirst(String s){Vector<String> vs=new Vector<String>();int ii=0;if(IsStartWithEnd(s)){vs.add(""+s.charAt(0));}if(s.length()==1&&IsNoENd(s)){//形如Fisst(A)Vector<String> temp=getRight(s);for(int i=0;i<temp.size();i++){vs=addElements(vs,getFirst(temp.get(i)));}//for}//ifif(s.length()!=1){//形如First(AB)或者First(AaB)for(ii=0;ii<s.length();ii++){String ss=""+s.charAt(ii);if(Isindicateempty(ss)){//如果能退出空Vector<String> temp=getFirst(ss);if(temp.contains("e")){//如果有空则删除temp.remove("e");}vs=addElements(vs,temp);}//ifelse{vs=addElements(vs,getFirst(ss));break;}} //forif(ii==s.length()){//如果所有的非终结符都能退出空,则将e加入vs.add("e");}}//if if(s.length()!=1){//形如First(AB)或者First(AaB)return vs;}}//class Firstclass Select{Elements elements;First first;Follow follow;Emptytable emptytable;Vector<String> end;Vector<String> noend;Vector<Vector<String>> produce;Vector<Vector<String>> flagtable=new Vector<Vector<String>>();Vector<Vector<String>> followtable=new Vector<Vector<String>>();public Select(Elements _elements,Emptytable _emptytable,First _first,Follow _follow){ this.elements=_elements;this.emptytable=_emptytable;this.end=elements.getend();this.noend=elements.getnoend();this.produce=elements.getproduce();this.first=_first;this.follow=_follow;init_flagtable();}public void showselecttable(){for(int i=0;i<produce.size();i++){Vector<String> temp=produce.get(i);System.out.println();System.out.print("产生式"+temp.get(0)+"->"+temp.get(1)+"的select集是:");Vector<String> select=getselect(temp);for(int j=0;j<select.size();j++){System.out.print(select.get(j)+",");}}}public Vector<String> addElements(Vector<String> vs,Vector<String>temp){for(int i=0;i<temp.size();i++){if(!vs.contains(temp.get(i)))vs.add(temp.get(i));}//forreturn vs;}//public Vector<String> addElements(Vector<String> vs,Vector<String>temp){public Vector<Vector<String>> getallproduces(String left){//返回以left为左部的所有产生式Vector<Vector<String>> vs=new Vector<Vector<String>>();for(int i=0;i<produce.size();i++){Vector<String> temp=produce.get(i);if(temp.get(0).equals(left))vs.add(temp);}return vs;}public void init_flagtable(){for(int i=0;i<noend.size();i++){Vector<String> temp=new V ector<String>();temp.add(noend.get(i));temp.add("no");flagtable.add(temp);}//for}//public void init_flagtablepublic String getFlagTable(String s){for(int i=0;i<flagtable.size();i++){Vector<String> temp=flagtable.get(i);if(temp.get(0).equals(s)){return temp.get(1);}}//forreturn "no";}// public String getFlagTable(String s)public void setFlagTable(String s){for(int i=0;i<flagtable.size();i++){Vector<String> temp=flagtable.get(i);if(temp.get(0).equals(s)){temp.set(1,"yes");}}//for}// public String setFlagTable(String s)public boolean IsIndicateEmpty(String right){//判断产生式右部是否可以推出空for(int i=0;i<right.length();i++){String vv=""+right.charAt(i);if(vv.equals("e"))//如A->econtinue;if(elements.Iscontainend(vv)){//如果含有除e以外的终结符//System.out.println();return false;}if(elements.IsNoENd(vv)){//如果是个非终结符if(emptytable.whattag(vv).equals("yes"))continue;if(emptytable.whattag(vv).equals("no"))return false;}}return true;}// IsIndicateEmpty(String right){public Vector<String> getselect(Vector<String> temp){//返回某条产生式的select集合Vector<String> combination=new Vector<String>();String left=temp.get(0);String right=temp.get(1);if( IsIndicateEmpty(right)){//如果右部可以推出空的话Vector<String> firstcollection=first.getFirst(right);Vector<String> followcollection=follow.getFollow(left);combination=addElements(firstcollection,followcollection);combination.remove("e");return combination;}//ifelse{Vector<String> firstcollection=first.getFirst(right);return firstcollection;}//return combination;}// public Vector<String> getselect(Vector<String> temp)public Vector<Vector<String>> getcollectionOfselect(Vector<Vector<String>> allproduce){//返回有相同左部的产生式的select集的集合Vector<Vector<String>> selectcollection=new Vector<Vector<String>>();for(int i=0;i<allproduce.size();i++){Vector<String> temp=allproduce.get(i);selectcollection.add( getselect(temp));}return selectcollection;}// public Vector<Vector<String>> getcollectionOfselect(Vector<Vector<String>> allproduce)public boolean IsIntersection( Vector<V ector<String>> selectcollection){for(int i=0;i<selectcollection.size();i++){Vector<String> temp=selectcollection.get(i);for(int j=0;j<temp.size();j++){String s=temp.get(i);for(int m=i+1;m<selectcollection.size();m++){Vector<String> vv=selectcollection.get(m);if(vv.contains(s));System.out.println();System.out.println("产生交集"+s+"不是LL1,程序即将结束");return true;}//for m}// for j}// for ireturn false;}// public boolean IsIntersectionpublic boolean Judge(){for(int i=0;i<produce.size();i++){Vector<String> temp=produce.get(i);String left=temp.get(0);String right=temp.get(1);if(getFlagTable(left).equals("yes"))continue;setFlagTable(left);Vector<Vector<String>> allproduce=getallproduces(left);Vector<Vector<String>> selectcollection= getcollectionOfselect( allproduce);if(IsIntersection( selectcollection)==true){System.out.println("以"+left+"为左部的产生式有交集,所以不是LL1");return false;}}//forreturn true;}}//class Selectclass Emptytable{Tools tools=new Tools();Elements elements;Vector<String> end;Vector<String> noend;Vector<Vector<String>> produce;Vector<String> newend;Vector<String> newnoend;Vector<Vector<String>> newproduce;Vector<Vector<String>> emptytable=new Vector<V ector<String>>();public Vector<Vector<String>> getemptytable(){return emptytable;}public void shownewinforamtion(){System.out.print("emptytable产生式输出如下:");for(int i=0;i<produce.size();i++){System.out.println(" ");Vector<String> temp=(Vector<String>)produce.get(i);System.out.print((String)temp.get(0)+"->"+(String)temp.get(1));}System.out.println();System.out.println("****************");if(newproduce.isEmpty()){System.out.println("newproduce has been cleared");return;}System.out.print("新的产生式输出如下:");for(int i=0;i<newproduce.size();i++){System.out.println(" ");Vector<String> temp=(Vector<String>)newproduce.get(i);System.out.print((String)temp.get(0)+"->"+(String)temp.get(1));}System.out.println(" ");}public String whattag(String noendcharacter ){//判断某个非终结符在表中的状态,只有yes,no unsure三种for(int i=0;i<emptytable.size();i++){Vector<String> temp=( Vector<String>)emptytable.get(i);if(temp.get(0).equals(noendcharacter)){return (String)temp.get(1);}//if}//forreturn "error";}public void initial_table(){for(int i=0;i<noend.size();i++){Vector<String> temp=new V ector<String>();temp.add((String)noend.get(i));temp.add("unsure");emptytable.add(temp);}//for}//public void initial_table(){public void updatetable(String left,String tag){for(int i=0;i<emptytable.size();i++){Vector<String> temp=(Vector<String>)emptytable.get(i);if(temp.get(0).equals(left)){temp.set(1,tag);//System.out.println("表格已被更新为:"+temp.get(0)+" "+temp.get(1));}}//for}//public void updatetable(String left,String tag)public void delete(String left,String right){//删除某条特定的产生式//System.out.println("欲删除产生式:"+left+"->"+right);Vector<String> temp=new V ector<String>();temp.add(left);temp.add(right);if(newproduce.remove(temp)){//System.out.println(left+"->"+right+" produce has deleted successfuly");}else{System.out.println("fail to remove this produce:"+left+"->"+right);}}//public void delete(String left,String right)public void deleteall(String left){//删除以某个字符为左部的所有产生式boolean flag=true;BlockB:while(flag){flag=false;for(int i=0;i<newproduce.size();i++){Vector<String> temp=newproduce.get(i);if(temp.get(0).equals(left)){if(newproduce.remove(temp)){//System.out.println("以"+left+"为左部的产生式被删除");}else{//System.out.println("fail to remove this produce:"+"以"+left+"为左部的产生式");}flag=true;continue BlockB;}//if}//for}//while()}//public void deleteall(String left)public boolean Isleftempty(String left){//判断以某个左部为产生式是否为空for(int i=0;i<newproduce.size();i++){Vector<String> temp=(Vector<String>)newproduce.get(i);if(temp.get(0).equals(left)){return false;}}//forreturn true;}//public boolean Isleftempty(String left)public void firststep(){//第一步(删除某条产生式之后向量的长度会变短,再用get(i)会取不到数据,所以要用到BLOCK)Boolean flag=true;BlockA:while(flag==true){flag=false;for(int i=0;i<newproduce.size();i++){Vector<String> temp=newproduce.get(i);String left=temp.get(0);String right=temp.get(1);if(elements.Iscontainend(right)){//如果产生式的右部含有终结符则删除//System.out.println("产生式的右部为:"+right);delete(left,right);if(Isleftempty(left)){//如果以此为左部的产生式都被删除了,则将表格对应的修改为noupdatetable(left,"no");}//内层ifflag=true;continue BlockA;}//if 外层} //for}//while()}//public void firststep()public void secondstep(){//第二步Boolean flag=true;BlockC:while(flag==true){flag=false;for(int i=0;i<newproduce.size();i++){Vector<String> temp=newproduce.get(i);String left=temp.get(0);String right=temp.get(1);String kong=""+"e";if(right.equals(kong)){//如果右部是空updatetable(left,"yes");deleteall(left);flag=true;continue BlockC;}}//for}//while()}//public void secondstep()public void thirdstep(){boolean flag=true;BlockD:while(flag==true){flag=false;for(int i=0;i<newproduce.size();i++){Vector<String> temp=(Vector<String>)newproduce.get(i);String left=temp.get(0);String _right=temp.get(1);StringBuffer right=new StringBuffer(_right);for(int j=0;j<right.length();j++){String s=""+right.charAt(j);//System.out.println("终结符S为"+s);StringBuffer tag=new StringBuffer(whattag(s));String _tag=tag.toString();//System.out.println(s+"的tag="+tag);if(_tag.equals("yes")){//如果该非终结符是yes的话,删除该非终结符int index=right.indexOf(s);if(index!=-1){//System.out.println("index="+index);right.deleteCharAt(index);if(right.length()==0){//如果该产生式的右部为空的话//System.out.println("第三步。

相关主题