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

📄 fandf.java

📁 实现编译原理中 通过已知的文法来产生First集和FOLLOW集 以及SLR分析表
💻 JAVA
字号:
import java.io.*;
import java.util.*;
class First
{
    char v;
    int i;
    String Fi;
    String Fo;
    First(char a)
    {
       v=a;
       i=0;
       Fi="";
       Fo="";
    }
    First()
    {
       v=' ';
       i=0;
       Fi="";
       Fo="";
    }
};
public class FandF{
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
             BufferedReader inStream=new BufferedReader(new FileReader("wen.txt"));
             FileOutputStream fos1=new FileOutputStream("First.txt");
             FileOutputStream fos2=new FileOutputStream("Follow.txt"); 
             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();
             }
             String[] keys=lines.split(" ");
             for(int i=0;i<keys.length;i++)
               System.out.println(keys[i]);
             line="";     
             for(int i=0;i<keys.length;i++)
             {
                 int a=0;
                 for(int j=0;j<line.length();j++)
                       if(line.charAt(j)==keys[i].charAt(0))
                          a=1;
                 if(a==0)
                    line+=keys[i].charAt(0)+" ";
             }
             System.out.println(line);
             String[] vN=line.split(" "); 
             line="";
             for(int i=0;i<keys.length;i++)
             {
                  
                   for(int j=3;j<keys[i].length();j++)
                   {
                       int b=0;
                       for(int l=0;l<vN.length;l++)
                            if(vN[l].charAt(0)==keys[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)==keys[i].charAt(j))
                                   a=1;
                            if(a==0)
                              line+=keys[i].charAt(j);
                       }        
                    }
                    if(line.length()!=0)
                    if(line.charAt(line.length()-1)!=' ')
                        line+=" ";
             }
             System.out.println(line);
             String[] vT=line.split(" "); 
             First first[]=new First[vN.length];
             int quque[]=new int[keys.length];
             int quque0[]=new int[keys.length];
             for(int i=0;i<vN.length;i++)
            	 first[i]=new First(vN[i].charAt(0));
             int vnLable=0;
             for(int i=0;i<keys.length;i++)
                 quque[i]=-1;
             for(int i=0;i<keys.length;i++)
            	 quque0[i]=0;
             for(int i=0;i<keys.length;i++)
             {
                 int j,k;
                 for(j=0;j<vN.length;j++)
                      if(first[j].v==keys[i].charAt(0))
                           break;
                 if(keys[i].charAt(3)==keys[i].charAt(0))
                           continue;
                 for(k=0;k<vN.length;k++)  
                      if(keys[i].charAt(3)==vN[k].charAt(0))
                      {
                          first[j].i=1;
                          quque[i]=3;
                          vnLable++;
                          break;
                      }
                 if(quque[i]==-1)
                 {
                      for(k=0;k<first[j].Fi.length();k++)
                           if(first[j].Fi.charAt(k)==keys[i].charAt(3))
                                       break;
                      if(k==first[j].Fi.length())
                      first[j].Fi+=keys[i].charAt(3);//+" ";
                 }
            }
            while(vnLable!=0)
            {
            	int i,j,k;
            	for(i=0;i<quque.length;i++)
            	{
            		if(quque[i]!=-1)
            		{
            			 for(j=0;j<vN.length;j++)
                             if(first[j].v==keys[i].charAt(0))
                                  break;
            			 for(k=0;k<vN.length;k++)
                             if(first[k].v==keys[i].charAt(quque[i]))
                                  break;
            			 if(first[k].i==0)
            			 {
            				int elable=0;
            				for(int n=0;n<first[k].Fi.length();n++)
            				{
            					if(first[k].Fi.charAt(n)=='@')
            					{      						
            						if(quque[i]+1<keys[i].length())
            						{
            							if(first[j].v!=keys[i].charAt(quque[i]+1))
            							{
            							int m;
            							for(m=0;m<vN.length;m++)
            								if(vN[m].charAt(0)==keys[i].charAt(quque[i]+1))
            									break;
            							if(m==vN.length)
            								first[j].Fi+=keys[i].charAt(quque[i]+1);
            							else
            								elable=1;
            							}
            						}
            						
            						
            					}
            					else
            				        first[j].Fi+=first[k].Fi.charAt(n);
            					
            				}
            				if(elable==1)
            					quque[i]++;
            				else
            				{
            					first[j].i=0;
            					vnLable--;
            					quque[i]=-1;
            				}
            			 }
            		}
            	}           	
            }
            for(int i=0;i<vN.length;i++)
            {  
            	String str="";
            	for(int j=0;j<first[i].Fi.length();j++)
            	{
            		if(first[i].Fi.charAt(j)==' ')
            			if(str.length()!=0)
            				if(str.charAt(str.length()-1)==' ')
            					continue;
            				else
            					str+=first[i].Fi.charAt(j);
            			else
            				continue;
            		else
            		{
            			int k;
            			for(k=0;k<str.length();k++)
            				if(str.charAt(k)==first[i].Fi.charAt(j))
            					break;
            			if(k==str.length())
            				str+=first[i].Fi.charAt(j);
            		}
            	}
            	first[i].Fi=str;
            }
            for(int i=0;i<vN.length;i++)
            {
            	fos1.write((first[i].v+" "+first[i].Fi).getBytes());
            	fos1.write("\r\n".getBytes());
            }
            first[0].Fo+='#';
            for(int i=0;i<keys.length;i++)
            {
            	for(int j=3;j<keys[i].length();j++)
            	{
            		int j0;
            		int k;
            		for(k=0;k<first.length;k++)
            			if(first[k].v==keys[i].charAt(j))
            				break;
            		if(k<first.length)
            		{
            			if(j+1==keys[i].length())
            			{
            				if(first[k].v!=keys[i].charAt(0))
            				{
            					first[k].i=1;
            					if(quque[i]==-1)
                				quque[i]=j;
                				quque0[i]=j;
                				vnLable++;
            				}           				
            			}
            			else
            			{
            				    j0=j;
            	                int lable0=1;
            	                while(lable0==1&&j0<keys[i].length()-1)
            	                {
            	                	int n;
            	                	lable0=0;
                    				for(n=0;n<first.length;n++)
                    					if(first[n].v==keys[i].charAt(j0+1))
                    						break;
                    				if(n==first.length)
                    				{
                    					first[k].Fo+=keys[i].charAt(j0+1);
                    				    break;
                    				}
                    				else
            	                	for(int m=0;m<first[n].Fi.length();m++)
                					{
                						if(first[n].Fi.charAt(m)!='@')
                							first[k].Fo+=first[n].Fi.charAt(m);
                						else
                						{
                							lable0=1;
                							j0++;
                						}
                					}
            	                }
            	                if(lable0==1&&j0==keys[i].length()-1)
            	                {
            	                	first[k].i=1;
            	                	if(quque[i]==-1)
                    				quque[i]=j;
                    				quque0[i]=keys[i].length()-1;
                    				vnLable++;
            	                }
            				}
            						
            			}
            		}            		      
            	
            }  
            while(vnLable>0)
            {
            	int i,j,k;
            	for(i=0;i<quque.length;i++)
            	{
            		if(quque[i]!=-1)
            		{
            			for(int n=quque[i];n<=quque0[i];n++)
            			{
            				for(j=0;j<first.length;j++)
                				if(first[j].v==keys[i].charAt(n))
                					break;
                			for(k=0;k<first.length;k++)
                				if(first[k].v==keys[i].charAt(0))
                					break;
                			if(first[k].i==0)
                			{
                				first[j].Fo+=first[k].Fo;
                				quque[i]=-1;
                				vnLable--;
                			}               			
            			}            			
            		}
            	}
            }
            for(int i=0;i<first.length;i++)
            {
            	fos2.write((first[i].v+" "+first[i].Fo).getBytes());
            	fos2.write("\r\n".getBytes());
            }
        }
}

⌨️ 快捷键说明

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