⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxb.java

📁 实现编译原理中 通过已知的文法来产生First集和FOLLOW集 以及SLR分析表
💻 JAVA
字号:
import java.io.*;
import java.util.*;
public class  FXB{
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
             BufferedReader inStream=new BufferedReader(new FileReader("wen.txt"));
             BufferedReader inStreamF=new BufferedReader(new FileReader("Follow.txt"));
             OutputStream out=new FileOutputStream(new File("biao.txt"));
             DataOutputStream  dout=new DataOutputStream(out);        
             String lines;
             String line;
             lines="";
             line=inStream.readLine();
             while(line!=null)
             {
                  String[] keys=line.split(" ");
                  lines+=keys[0]+" ";
                  for(int i=1;i<keys.length;i++)
                  lines+=keys[0].charAt(0)+"->"+keys[i]+" ";
                  line=inStream.readLine();
             }
             Global.Product=lines.split(" ");
             line="";     
             for(int i=0;i< Global.Product.length;i++)
             {
                 int a=0;
                 for(int j=0;j<line.length();j++)
                       if(line.charAt(j)== Global.Product[i].charAt(0))
                          a=1;
                 if(a==0)
                    line+= Global.Product[i].charAt(0)+" ";
             }
             Global.vN=line.split(" "); 
             line="";
             for(int i=0;i< Global.Product.length;i++)
             {
                  
                   for(int j=3;j< Global.Product[i].length();j++)
                   {
                       int b=0;
                       for(int l=0;l< Global.vN.length;l++)
                            if( Global.vN[l].charAt(0)== Global.Product[i].charAt(j))
                            {
                                 if(line.length()!=0)
                                 if(line.charAt(line.length()-1)!=' ')
                                 line+=" ";
                                 b=1;
                                 break;                     
                            }
                       if(b==0)
                       {
                            int a=0;
                            for(int k=0;k<line.length();k++)
                               if(line.charAt(k)== Global.Product[i].charAt(j))
                                   a=1;
                            if(a==0)
                              line+= Global.Product[i].charAt(j);
                       }        
                    }
                    if(line.length()!=0)
                    if(line.charAt(line.length()-1)!=' ')
                        line+=" ";
             }
            line+="#";
            Global.vT=line.split(" "); 
            System.out.print("SLR(1)"+" "+'\t');
            for(int i=0;i<Global.vT.length;i++)
            	 System.out.print(Global.vT[i]+" "+'\t');
            for(int i=0;i<Global.vN.length;i++)
           	 System.out.print(Global.vN[i]+" "+'\t');
            System.out.println();
            Global.sum=1;
            Global.slr=new Slr[50];
            for(int i=0;i<50;i++)
            	Global.slr[i]=new Slr();
            Global.slr[0].setc(0,3,-1);
            Global.slr[0].extend();
            pass(Global.slr[0]);
            for(int i=1;i<Global.sum;i++)
            {
            	Global.slr[i].extend();
            	pass(Global.slr[i]);
            }
           /*for(int i=0;i<Global.sum;i++)
           { System.out.println(i+" "+Global.slr[i].num+" "+Global.slr[i].cnum);
               for(int j=0;j<Global.slr[i].num;j++)
            	System.out.println(Global.slr[i].chan[j]+" "+Global.slr[i].dian[j]+" "+Global.slr[i].next[j]);
               System.out.println();
           }*/
            line="";
            lines="";
            line+=inStreamF.readLine();
            while(line!=null)
            {
                lines+=line+":";
                line=inStreamF.readLine();
            }
            inStream.close();
            String[] Fw=lines.split(":");
            int[][] slr=new int[Global.sum][Global.vT.length+Global.vN.length];
            for(int i=0;i<Global.sum;i++)
            	for(int j=0;j<Global.vT.length+Global.vN.length;j++)
            		slr[i][j]=-1;
            for(int i=0;i<Global.sum;i++)
            {
            	for(int j=0;j<Global.slr[i].num;j++)
            	{
            		if(Global.slr[i].next[j]==-1)
            		{
            			int k,m,n=0;
            			for(k=0;k<Fw.length;k++)
            				if(Fw[k].charAt(0)==Global.Product[Global.slr[i].chan[j]].charAt(0))
            					break;
            			for(m=2;m<Fw[k].length();m++)
            			{
            				for(n=0;n<Global.vT.length;n++)
            					if(Fw[k].charAt(m)==Global.vT[n].charAt(0))
            						break;
            			    slr[i][n]=100+Global.slr[i].chan[j];
            			}          			
            		}
            		else
            		{
            			for(int m=0;m<Global.vT.length;m++)
            			    if(Global.vT[m].charAt(0)==Global.Product[Global.slr[i].chan[j]].charAt(Global.slr[i].dian[j]))
            			    	slr[i][m]=Global.slr[i].next[j];
            			for(int n=0;n<Global.vN.length;n++)
            				if(Global.vN[n].charAt(0)==Global.Product[Global.slr[i].chan[j]].charAt(Global.slr[i].dian[j]))
            			    	slr[i][n+Global.vT.length]=Global.slr[i].next[j];
            		}
            		
            	
            		
               }
            }
            dout.writeInt(Global.sum);
    		dout.writeInt(Global.vT.length+Global.vN.length);
            for(int i=0;i<Global.sum;i++)
            {
            	System.out.print(i+" "+'\t');
            	for(int j=0;j<Global.vT.length+Global.vN.length;j++)
            	{
            		 System.out.print(slr[i][j]+" "+'\t');
            	     dout.writeInt(slr[i][j]);
            	}
            	 System.out.println();
            }   
            dout.flush();
            dout.close();
	}
	static void pass(Slr S)
	{
		int n=Global.sum;
		for(int i=0;i<S.num;i++)
		{
			int j;
			if(Global.Product[S.chan[i]].length()==S.dian[i])
			{
				S.next[i]=-1;
				continue ;
			}
			for(j=0;j<i;j++)
			{
				if(Global.Product[S.chan[j]].length()!=S.dian[j]&&Global.Product[S.chan[i]].charAt(S.dian[i])==Global.Product[S.chan[j]].charAt(S.dian[j]))
				{
					S.next[i]=S.next[j];
					Global.slr[S.next[j]].setc(S.chan[i], S.dian[i]+1,-1);
					break;
				}
			}
			if(i==j)
			{
				Global.slr[Global.sum]=new Slr();
				Global.slr[Global.sum].setc(S.chan[i], S.dian[i]+1, -1);
				S.next[i]=Global.sum;
				Global.sum++;
			}
		}
		for(int i=n;i<Global.sum;i++)
		for(int j=0;j<n;j++)
		{
			if(bijiao(Global.slr[i],Global.slr[j]))
			{ 
				int k;
			    int lable=0;
				for( k=0;k<S.num;k++)
				{
					if(S.next[k]==i)
					{
						S.next[k]=j;
						lable=1;
					}
					else if(lable==1)
						S.next[k]--;
				}
				for(int l=i;l<Global.sum-1;l++)
				{
					//System.out.println(Global.slr[l].chan[0]);
					Global.slr[l]=Global.slr[l+1];
					//System.out.println(Global.slr[l].chan[0]);
				}
				//System.out.println(Global.slr[i].chan[0]);
				Global.sum--;
				//i--;
			}
		}
	}
	static boolean bijiao(Slr S1,Slr S2)
	{
		 int n=0;
		 if(S1.cnum!=S2.cnum)
			 return false;	 
		 for(int i=0;i<S1.cnum;i++)
			 for(int j=0;j<S2.cnum;j++)
				 if(S1.chan[i]==S2.chan[j]&&S1.dian[i]==S2.dian[j])
					 n++;
         if(S1.cnum==n)
		     return true;
         else 
        	 return false;
	}
}
class Slr
{
	public int chan[];
	public int dian[];
	public int next[];
	public int num;
	public int cnum;
	public Slr()
	{
		chan=new int[50];
		dian=new int[50];
		next=new int[50];
		num=0;
		cnum=0;
	}
	public void set(int c,int d,int n)
    {
		chan[num]=c;
		dian[num]=d;
		next[num]=n;
		num++;  
    }
	public void setc(int c,int d,int n)
    {
		chan[num]=c;
		dian[num]=d;
		next[num]=n;
		num++;   
		cnum++;
    }
	public void extend()
	{
		for(int i=0;i<num;i++)
		{
			if(Global.Product[chan[i]].length()==dian[i])
				break;
			int j=0;
			for(j=0;j<num;j++)
			   if(Global.Product[chan[i]].charAt(dian[i])==Global.Product[chan[j]].charAt(0)&&dian[j]==3)
				     break;
			if(j==num)
			   for(int k=0;k<Global.Product.length;k++)
					if(Global.Product[k].charAt(0)==Global.Product[chan[i]].charAt(dian[i]))
						set(k,3,-1);
		}
	}
}
class Global
{
   public static String[] Product;
   public static String[] vN;
   public static String[] vT;
   public static Slr[] slr;
   public static int sum;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -