LL1文法分析(First集,Follow集,Select集,ll分析表,语句分析)

来源:互联网 发布:ok组合三连冠数据 编辑:程序博客网 时间:2024/05/18 09:14
///**共有三个类,主类为LL.java,读取TXT文件中的文法 类ReadInfo.java,  获取First集,Follow集,Select集,ll分析表,语句分析的类GetFFS.java读取的文法必须是A->qB|cT而不是A->qB和A->cT这种形式
//第一个ll.java*************************LL.java********************************************/ * author:Ack訾 * Date:3/11/2012 * Attention:Please Input a  Grammer that doesn't contain recursion,otherwise it will be endless loop; * (ha ha!I don't how to solve this question) */package com.algorithm;import java.awt.BorderLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class LL extends JFrame implements ActionListener{/*** */private static final long serialVersionUID = 1L;JFrame jf=new JFrame();JPanel displayPanel,controlPanel,resultPanel;JTextField filePath;JTextField sentence;JTextArea jta2;int height =Toolkit.getDefaultToolkit().getScreenSize().height;int width=Toolkit.getDefaultToolkit().getScreenSize().width;LL(){jf.setSize(700,500);jf.setLocation((width-700)/2,(height-500)/2);JPanel displayPanel=new JPanel();JPanel controlPanel=new JPanel();JPanel resultPanel=new JPanel();JButton analyze_Gramar =new JButton("分析此文法");analyze_Gramar .addActionListener(this);JButton save=new JButton("保存");save.addActionListener(this);JLabel tip=new JLabel("请输入可用文件路径:");JLabel sentence_Label=new JLabel("请输入语句:");JButton analyze_Sentence =new JButton("分析语句");analyze_Sentence.addActionListener(this);//1filePath=new JTextField(20);filePath.addActionListener(this);    jta2=new JTextArea(20,62);JScrollPane jsp =new JScrollPane(jta2);//2sentence=new JTextField(20);sentence.addActionListener(this);   resultPanel.add(jsp);controlPanel.add(tip);controlPanel.add(filePath);controlPanel.add(analyze_Gramar);controlPanel.add(save);displayPanel.add(sentence_Label);displayPanel.add(sentence);displayPanel.add(analyze_Sentence);jf.add(displayPanel,BorderLayout.CENTER);jf.add(controlPanel, BorderLayout.NORTH);jf.add(resultPanel,BorderLayout.SOUTH);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setResizable(false);jf.setVisible(true);}public static void main(String[] args) {new LL();}public void actionPerformed(ActionEvent e) {if(e.getActionCommand()=="分析此文法"){String f=filePath.getText();ReadInfo ri=new ReadInfo();       String[][] ll = null;try {ll = ri.gettext(f);} catch (IOException e1) {e1.printStackTrace();}       GetFFS g=new GetFFS(ll);       //①读取的文法放在ll[][]二维数组中,可根据下面的注释语句进行打印       jta2.append("文法G"+"["+ll[0][0]+"]"+":"); jta2.append("\n");       for(int i=0;i<ll[0].length;i++){        jta2.append(ll[0][i]);        jta2.append("->");        jta2.append(ll[1][i]);        jta2.append("\n");       }        jta2.append("\n");             //②终结符放在NT[]中(not terminate)可通过下面注释语句进行打印       String[]NT = g.getNT();       jta2.append(" 非终结符集:");jta2.append("{");        for(int i=0;i<NT.length;i++){        if(NT.length-1==i)        jta2.append(NT[i]);        else        jta2.append(NT[i]+",");            }        jta2.append("}");jta2.append("\n");                //③终结符放在T[]中(teminate) 可通过下面注释语句进行打印        String[]T = g.getT();        jta2.append(" 终结符集:");jta2.append("{");         for(int i=0;i<T.length;i++){        if(T.length-1 ==i)      jta2.append(T[i]);        else      jta2.append(T[i]+",");            }         jta2.append("}");         jta2.append("\n");                  //④注意文法的First集放在First[][]二维数组中   可通过下面注释语句进行打印         jta2.append("\n");       String[][] First=g.getFirst();       jta2.append("FIRST集:");  jta2.append("\n");        for(int i=0;i<First[0].length;i++){        jta2.append("First"+"("+First[0][i]+")"+"=");        jta2.append("{");        char[] ch=First[1][i].toCharArray();        for(int j=0;j<ch.length;j++){                if(ch.length-1 ==j)      jta2.append(String.valueOf(ch[j]));        else jta2.append(ch[j]+",");        }      jta2.append("}");      jta2.append("\n");              //jta2.appendln("{"+First[1][i]+"}");        }         jta2.append("\n");              //⑤Follow集        String[][] Follow=null;        try{   Follow=g.getFollow();}catch (Exception es) {        jta2.append("此文法存在递归!");    }        jta2.append("FOLLOw集:");  jta2.append("\n");         for(int i=0;i<Follow[0].length;i++){         jta2.append("Follow"+"("+Follow[0][i]+")"+"=");         jta2.append("{");        char[] ch=Follow[1][i].toCharArray();        for(int j=0;j<ch.length;j++){        if(ch.length-1 ==j)      jta2.append(String.valueOf(ch[j]));        else  jta2.append(ch[j]+",");        }      jta2.append("}"); jta2.append("\n");              //jta2.appendln(First[1][i]);         }        //⑥求select集         jta2.append("\n");         String[][] Select=g.getSelect();         String[][] Selectbefore=g.getSelectbefore();         jta2.append("Select集:");         jta2.append("\n");         for(int i=0;i<Select[0].length;i++){         jta2.append("Select"+"("+ Select[0][i]+"->"+Selectbefore[1][i]+")"+"=");         jta2.append("{");        char[] ch=Select[1][i].toCharArray();        for(int j=0;j<ch.length;j++){        if(ch.length-1 ==j)      jta2.append(String.valueOf(ch[j]));        else jta2.append(ch[j]+",");        }        jta2.append("}");jta2.append("\n");         }          jta2.append("\n");         //  jta2.appendln(Select[1][1]);            //将select的结果存在Analyze[3][Select[0].lenth]         String[][] Analyze=new String[3][Select[0].length];         //jta2.appendln(Analyze[1].length);           for(int i=0;i<Analyze[0].length;i++){        Analyze[0][i]=Select[0][i];        Analyze[1][i]=Selectbefore[1][i];        Analyze[2][i]=Select[1][i];         }         jta2.append("\n");         boolean isLL1=true;         for(int i=0;i<Analyze[0].length-1;i++){        if(Analyze[0][i].equals(Analyze[0][i+1])){        char []ch=Analyze[2][i].toCharArray();        for(int j=0;j<ch.length;j++){        if(Analyze[2][i+1].contains(String.valueOf(ch[j]))){        jta2.append("∵");        jta2.append("Select"+"("+Analyze[0][i]+"->"+Analyze[1][i]+")"+"∩"        +"Select"+"("+Analyze[0][i]+"->"+Analyze[1][i+1]+")"+"≠"+"¤");        jta2.append("∴");               isLL1=false;        }        }        }         }         //判断是否是LL(1)文法         if(isLL1==false){          jta2.append("\n");         jta2.append("文法G"+"["+ll[0][0]+"]"+":"+"不是LL(1)文法!");}         //求select集合得出的终结符号         ArrayList<String> T_list=new ArrayList<String>();         for(int i=0;i<Analyze[0].length;i++){        char[] ch=Analyze[2][i].toCharArray();        for(int j=0;j<ch.length;j++){       String temp=String.valueOf(ch[j]);       if(!T_list.contains(temp))       T_list.add(temp);        }         }         //求select集合得出的终结符号,放在select_T[]中         String[] select_T=new String[T_list.size()];         for(int i=0;i<T_list.size();i++){        select_T[i]=String.valueOf(T_list.get(i));        //jta2.appendln(select_T[i]);         }                  jta2.append("\n");jta2.append("\n");       //⑦求分析表it         if(isLL1==true){        jta2.append("文法G"+"["+ll[0][0]+"]"+":"+"是LL(1)文法!");       jta2.append("\n");         jta2.append("LL(1)分析表:"); jta2.append("\n");         jta2.append("-----------------------------------------------------------" +        "-----------------------------------------------------------------------------------------------------------");              jta2.append("\n");     jta2.append("\t\t"+" "+" ");         for(int i=0;i<select_T.length;i++){                 jta2.append(select_T[i]+"\t");         jta2.append(" "+"  ");         //jta2.append("\n");         }         jta2.append("\t ");         jta2.append("\n");        jta2.append("-----------------------------------------------------------" +        "-----------------------------------------------------------------------------------------------------------");                 // jta2.append("\n");         for(int i=0;i<NT.length;i++){         jta2.append("\n");         jta2.append("\t ");                 jta2.append(NT[i]);      for(int j=0;j<select_T.length;j++){       boolean isE=false;      for(int k=0;k<Analyze[1].length;k++){         if(Analyze[2][k].contains(select_T[j])&&Analyze[0][k].equals(NT[i])){        isE=true;        jta2.append("\t ");        jta2.append("->"+Analyze[1][k]);//+"("+select_T[j]+")");         }           }      if(isE==false){jta2.append(" \t ");}      }       jta2.append("\n");       jta2.append("-----------------------------------------------------------" +        "-----------------------------------------------------------------------------------------------------------");                  }         }         jta2.append("\n");}jta2.append("\n");if(e.getActionCommand()=="分析语句"){ReadInfo ri=new ReadInfo();String[][] ll=null;try {ll = ri.gettext(filePath.getText());} catch (IOException e1) {e1.printStackTrace();}       GetFFS g=new GetFFS(ll);String[][] Select=g.getSelect();      String[][] Selectbefore=g.getSelectbefore();String[][] Analyze=new String[3][Select[0].length];      //System.out.println(Analyze[1].length);        for(int i=0;i<Analyze[0].length;i++){      Analyze[0][i]=Select[0][i];      Analyze[1][i]=Selectbefore[1][i];      Analyze[2][i]=Select[1][i];      //System.out.println(Analyze[2][i]);      }  ArrayList<String> T_list=new ArrayList<String>();      for(int i=0;i<Analyze[0].length;i++){      char[] ch=Analyze[2][i].toCharArray();      for(int j=0;j<ch.length;j++){     String temp=String.valueOf(ch[j]);     if(!T_list.contains(temp))     T_list.add(temp);      }      }String string=sentence.getText();jta2.append("输入的句子是:");   jta2.append(string);   jta2.append("\n");      char[] ch=string.toCharArray();      //s用于存放读入的语句      ArrayList<String>  s=new ArrayList<String>();      //stack用于存放分析栈      ArrayList<String>  stack=new ArrayList<String>();      stack.add("#");      for(int i=0;i<ch.length;i++){      s.add(String.valueOf(ch[i]));      }      stack.add(Analyze[0][0]);      ArrayList<String>  sentence_result=new ArrayList<String>();      for(int i=0;i<ch.length;i++){     // do{       String s_result=new String();      s_result=s_result.concat(stack+"\t"+s+"\t");      //int i=0;     // jta2.append("("+z+")");jta2.append("\t");jta2.append(String.valueOf(stack));jta2.append("\t");jta2.append(String.valueOf(s));jta2.append("\t");      for(int j=0;j<Analyze[0].length;j++){                   if((!string.contains(String.valueOf(stack.get(stack.size()-1))))&&Analyze[0][j].equals(stack.get(stack.size()-1))&&Analyze[2][j].contains(String.valueOf(s.get(0))))           {               //jta2.append(Analyze[0][j]+"->"+Analyze[1][j]);jta2.append("\t");jta2.append("\n");           s_result=s_result.concat(Analyze[0][j]+"->"+Analyze[1][j]);           sentence_result.add(s_result);           s_result="";           stack.remove(Analyze[0][j]);       StringBuffer sb=new StringBuffer(Analyze[1][j]);       String st=(sb.reverse()).toString();       char[] tempchar=st.toCharArray();       for(int k=0;k<st.length();k++){       if(tempchar[k]!='ε')       stack.add(String.valueOf(tempchar[k]));       }      s_result=s_result.concat(stack+"\t"+s+"\t");           }      }          // System.out.print(1);System.out.print("\t");System.out.print(stack);System.out.print("\t");System.out.print(s);System.out.print("\t");       if(s.get(0).equals(stack.get(stack.size()-1))){       if(stack.get(stack.size()-1)!="#"){       // jta2.append(s.get(0)+"匹配"); jta2.append("\t");jta2.append("\n");       s_result=s_result.concat(s.get(0)+"匹配");               sentence_result.add(s_result);       }       else{ //jta2.append("Accept");       sentence_result.add(s_result+"Accept!");}               }       else{       // sentence_result.add("Failed!");       //jta2.append("\n");       //jta2.append(string+"\t"+"不是"+"文法G"+"["+ll[0][0]+"]"+"的句子");jta2.append("\n");       sentence_result.add(s_result+"Failed!");       //s_result="";       s_result=string+"不是"+"文法G"+"["+ll[0][0]+"]"+"的句子";       sentence_result.add(s_result);       break;}           s.remove(s.get(0));          stack.remove(stack.get(stack.size()-1));         }      for(int i=0;i<sentence_result.size();i++){      jta2.append("("+(i+1)+")");      jta2.append("\t");      jta2.append((String) sentence_result.get(i));jta2.append("\n");      }   }if(e.getActionCommand()=="保存"){String Stext=jta2.getText();File file =new File("G:\\大三实验课\\编译原理\\实验2\\result.txt");file.delete();try {PrintWriter out  = new PrintWriter(new BufferedWriter(new FileWriter("G:\\大三实验课\\编译原理\\实验2\\result.txt")));out.write(Stext);out.flush();out.close();} catch (IOException e1) {e1.printStackTrace();}               }}}//***************************************第二个GetFFS.java类
package com.algorithm;import java.util.ArrayList;//求first,follow,sellectclass GetFFS{public String [][]str;static String Tstring="";static String TstringFollow="";static String Tstringselect="";GetFFS(String[][] ll){str=ll;}//获取非终结符放到NT数组中String[] getNT(){//String [][] Follow=getFollow();String[] NT=new String[str[0].length];for(int i=0;i<str[0].length;i++){NT[i]=str[0][i];}return NT;}//获取终结符  放到T数组中String[] getT(){String[] NT1 = getNT();String temp=new String();for(int i=0;i<str[1].length;i++){temp=temp+str[1][i];}for(int i=0;i<NT1.length;i++){temp=temp.replaceAll(NT1[i],"");}temp=temp.replaceAll("\\|","");temp=temp.replaceAll("\\'","");//System.out.println(temp);char[] ch=new char[temp.length()];ch=temp.toCharArray();String resultString = new String();for(int i=0;i<ch.length;i++){if(!resultString.contains(String.valueOf(ch[i])))resultString=resultString.concat(String.valueOf(ch[i]));}//System.out.println(resultString);String[] T=new String[resultString.length()];for(int i=0;i<resultString.length();i++){T[i]=(String)String.valueOf(resultString.charAt(i));//System.out.println(T[i]);}return T;}//求first这里我们只考虑非终结符为大写字母的情况String[][] getFirst(){String[][] First = new String[2][str[0].length];for(int i=0;i<str[0].length;i++){First[0][i]=str[0][i];try{getF(str[0][i],str[1][i]);}catch (Exception e) {System.out.print("捕获异常:文法不是ll1文法!或其他问题:存在递归");}First[1][i]=Tstring;Tstring="";}return First;    }//递归算法求firstString getF(String str1,String str2){String temp="";//for(int i=0;i<str[0].length;i++){System.out.print(str[0][i]);}if(str2.contains("|")){String[] strtemp;strtemp=str2.split("\\|");for(int i=0;i<strtemp.length;i++){getF(str1,strtemp[i]);}}else{if('A'<=str2.charAt(0)&&str2.charAt(0)<='Z'){for(int i=0;i<str[0].length;i++){//System.out.print(str[0][i]);if(str[0][i].equals(String.valueOf(str2.charAt(0)))){if(!str1.equals(String.valueOf(str2.charAt(0))))getF(str[0][i],str[1][i]);}}}else{temp=String.valueOf(str2.charAt(0));if(!Tstring.contains(temp))Tstring=Tstring.concat(String.valueOf(str2.charAt(0)));}}return temp;}//求follow集String[][] getFollow(){String[][] Follow= new String[2][str[0].length];//public String [][]str;String temp;for(int i=0;i<str[0].length;i++){Follow[0][i]=str[0][i];getFo(str[0][i]);//getFo(str[0][0])="#";Follow[1][i]=TstringFollow;TstringFollow="";     }for(int i=0;i<Follow[0].length;i++){StringBuffer sb=new StringBuffer(Follow[1][i]);for(int j=0;j<sb.length();j++){if(sb.charAt(j)=='ε'||sb.charAt(j)=='\''){sb.deleteCharAt(j);temp=sb.toString();Follow[1][i]=temp;}}}return Follow;   }//递归求followString getFo(String str3){//public String [][]str;String [][] First=getFirst();String temp="";//假如受str1存在str[][]中的str[1][i]中,//若存在则判断是否有str[1][i]中的str1是否有后缀,//①若不存在则follow(str1)则寻找str[1][i]所对应的str[0][i]//②存在则follow(str1)=first(str1)if(str3.equals(str[0][0])){if(!TstringFollow.contains("#"))TstringFollow=TstringFollow.concat("#");}for(int i=0;i<str[0].length;i++){if(str[1][i].contains(str3)){char[]ch=str[1][i].toCharArray();for(int j=0;j<ch.length;j++){if(str3.equals(String.valueOf(ch[j]))){//j+1没有超出ch.length的时候//后缀为|时if(j+1==ch.length||ch[j+1]=='|')if(j+1<ch.length){//后缀为非终结符ch[j+1]=='|'||j+1==ch.lengthif('A'<=ch[j+1]&&ch[j+1]<='Z'){//求first(ch[j+1])for(int k=0;k<First[0].length;k++){//for(int l=0;l<Follow[0].)//if(){}if(First[0][k].equals(String.valueOf(ch[j+1]))){String temp1=String.valueOf((First[1][k]));if(!TstringFollow.contains(temp1))TstringFollow=TstringFollow.concat(First[1][k]);}}}//后缀为终结符号时加入follow(str1)else if(ch[j+1]=='|'){if(!str[0][i].equals(String.valueOf(ch[j])))getFo(String.valueOf(str[0][i]));}else{    String temp2=String.valueOf((ch[j+1]));if(!TstringFollow.contains(temp2))TstringFollow=TstringFollow.concat(String.valueOf((ch[j+1])));}}else{//求follow(str[0][i])if(!str[0][i].equals(String.valueOf(ch[j])))getFo(String.valueOf(str[0][i]));}}//j+1 超过ch.length时候/*else{//求follow(str[0][i])getFo(String.valueOf(str[0][i]));}*/}}}/*else{//System.out.print("哎!大哥!又出错了!");}*/return temp;}//求select集合String[][] getSelect(){String [][] First=getFirst();String [][] Follow=getFollow();ArrayList<String> selectNT=new ArrayList<String>();ArrayList<String> selectRight=new ArrayList<String>();//public String [][]str;//System.out.println(n);         String[] s; for(int i=0;i<str[0].length;i++){if(str[1][i].contains("|")){                s=str[1][i].split("\\|");                //selectNT.add(str[0][i]);//selectNT.add(str[0][i]);for(int j=0;j<s.length;j++){selectRight.add(s[j]); selectNT.add(str[0][i]);}}else{selectNT.add(str[0][i]);selectRight.add(str[1][i]);}}String[][] selectbefore= new String[2][selectNT.size()];String[][] select= new String[2][selectNT.size()]; for(int i=0;i<selectNT.size();i++){ selectbefore[0][i]=(String) selectNT.get(i); selectbefore[1][i]=(String) selectRight.get(i); select[0][i]=(String) selectNT.get(i);//System.out.println(selectbefore[0][i]);} for(int z=0;z<selectbefore[0].length;z++){ if(selectbefore[1][z].charAt(0)=='ε'){ String temp=selectbefore[0][z]; for(int e=0;e<Follow[0].length;e++){ if(Follow[0][e].equals(temp))select[1][z]=Follow[1][e]; } } else  if(!('A'<=selectbefore[1][z].charAt(0)&&selectbefore[1][z].charAt(0)<='Z')){ select[1][z]=String.valueOf(selectbefore[1][z].charAt(0));    } else{ String temp=String.valueOf(selectbefore[1][z].charAt(0)); for(int e=0;e<First[0].length;e++){ if(Follow[0][e].equals(temp))select[1][z]=First[1][e]; } }}return select;}//此方法是求Selectbefore[][]用来存不含“|”的文法String[][] getSelectbefore(){ArrayList<String> selectNT=new ArrayList<String>();ArrayList<String> selectRight=new ArrayList<String>();//public String [][]str;//System.out.println(n);         String[] s; for(int i=0;i<str[0].length;i++){if(str[1][i].contains("|")){                s=str[1][i].split("\\|");//selectNT.add(str[0][i]);for(int j=0;j<s.length;j++){selectRight.add(s[j]);selectNT.add(str[0][i]);}}else{selectNT.add(str[0][i]);selectRight.add(str[1][i]);}}String[][] selectbefore= new String[2][selectNT.size()];String[][] select= new String[2][selectNT.size()]; for(int i=0;i<selectNT.size();i++){ selectbefore[0][i]=(String) selectNT.get(i); selectbefore[1][i]=(String) selectRight.get(i); select[0][i]=(String) selectNT.get(i);//System.out.println(selectbefore[1][i]);} return selectbefore;}}
//**********************************************第三个为ReadInfo.java类
package com.algorithm;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;class ReadInfo{//读取input.txt文件中的内容String[][] gettext(String str) throws IOException{FileReader fr=new FileReader(str);BufferedReader br=new BufferedReader(fr);String temp;ArrayList<String> list =new ArrayList<String>();while((temp=br.readLine())!=null){list.add(temp);}br.close();String arr[]=new String[list.size()];String arrNT[]=new String[list.size()];//非终结符数组String arrT[]=new String[list.size()];//终结符号数组for(int i=0;i<list.size();i++){arr[i]=(String) list.get(i);//System.out.println(arr[i]);}for(int i=0;i<arr.length;i++){String[] temp1;temp1=arr[i].split("->");arrNT[i]=temp1[0];arrT[i]=temp1[1];}String[][] ll=new String[2][list.size()];for(int i=0;i<list.size();i++){ll[0][i]=arrNT[i];ll[1][i]=arrT[i];}return ll;
}
}
 


 

	
				
		
原创粉丝点击