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

📄 fs.java

📁 设计一个给定LL(1)分析表
💻 JAVA
字号:
package fangsheng;
import java.applet.*;
import java.awt.*;
import java.io.*;
public class FS extends Applet
{
	private static final long serialVersionUID = -7958149560134433005L;
	public static String[] pt1=new String[20];
	public static String[] pt2=new String[20];
	public static int number=-1;
	public void init()
	{
		String s;
		String s1;
		String s2;
		String s3;
		int m,n;
		try
		{
			System.out.println("输入非终结符:");
			BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
	        s1=br1.readLine();
	        m=s1.length();
			System.out.println("输入终结符:");
	        BufferedReader br2=new BufferedReader(new InputStreamReader(System.in));
	        s2=br2.readLine();
	        n=s2.length();
	        yz(s1,s2);
	        String[][] str=new String[m][n];
	        System.out.println("输入预测分析表:");
	        for(int i=0;i<m;i++)
	        {
	        	for(int j=0;j<n;j++)
	        	{
	        		BufferedReader br3=new BufferedReader(new InputStreamReader(System.in));
	    	        s3=br3.readLine();
	    	        str[i][j]=new String(s3);
	        	}
	        }
	        for(int i=0;i<m;i++)
	        {
	        	for(int j=0;j<n;j++)
	        	{
	        		System.out.print(str[i][j].toString()+"\t");
	        	}
	        	System.out.println();
	        }
			System.out.println("输入要分析的句子");
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	        s=br.readLine();
	        BYYL(s1,s2,s,str);
	        System.out.println("该句子的LL(1)分析过程结束");
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}
	public boolean isvt(String s1,String s2)
	{
	   boolean flag1=false;
	   for(int i=0;i<s1.length();i++)
	   {
	      for(int j=0;j<s2.length();j++)
	      {
	    	if(s1.charAt(i)==s2.charAt(j))
	  	    {
	  	       flag1=true;
	  	       break;
	  	     }
	      }
	   }
	     return flag1;
    }
	public void BYYL(String s1,String s2,String s3,String[][] str)
	{
		int num=0;
		boolean flag2=true;
		if(isvt(s3,s2)==false)
        {
        	System.out.println("输入的句子不是符合规定的句子!!!");
        	System.exit(0);
        }
        else
        {
        	s3=s3+"#";
        	String s4=new String("#"+s1.charAt(0));
        	System.out.println("分析过程如下:");
        	System.out.print("步骤     ");
        	System.out.print("分析栈    ");
        	System.out.print("输入栈       ");
        	System.out.println("所用产生式");
        	while(flag2==true)
	        {
        		int count=s3.length();
        		for(int i=0;i<count;i++)
    	        {
        			if(s4.charAt(s4.length()-1)==s3.charAt(0))
        			{
        				if(s3.charAt(0)=='#')
        				{
        					num=num+1;
        	        		System.out.print(num+"         ");
        	        		System.out.print(s4.charAt(0)+"    ");
        	        		System.out.print(s3+"    ");
        	        		System.out.println("接受");
        					flag2=false;
        					break;
        				}
        				else
        				{
        					num=num+1;
        	        		System.out.print(num+"          ");
        	        		System.out.print(s4+"      ");
        	        		System.out.print(s3+"      ");
        	        		System.out.println("“"+s3.charAt(0)+"”"+"匹配");
        	        		int k=s4.length();
        	        		s4=s4.substring(0,k-1);
        	        		s3=s3.substring(1);      	        		
        				}
        			}
        			else
        			{
        				if(str[ysvn(s4.charAt(s4.length()-1),s1)][ysvt(s3.charAt(0),s2)].toString().equals(" "))
        	        	{
        	            	System.out.println("该句子无法进行LL(1)分析");
        	            	flag2=false;
        	            	break;
        	        	}
        	        	else if(str[ysvn(s4.charAt(s4.length()-1),s1)][ysvt(s3.charAt(0),s2)].toString().equals("*"))
        	        	{
        	        		num=num+1;
        	        		number=number+1;
        	        		System.out.print(num+"          ");
        	        		System.out.print(s4+"      ");
        	        		System.out.print(s3+"      ");
        	        		System.out.println(s4.charAt(s4.length()-1)+"->"+"*");
        	        		pt1[number]=""+s4.charAt(s4.length()-1);
        	        		pt2[number]=""+"*";
        	        		int k=s4.length();
        	        		s4=s4.substring(0,k-1);
        	        		i=i-1;
        	        	}
        	        	else
        	        	{
        	        		num=num+1;
        	        		number=number+1;
        	        		String s5;
        	        		String s6;
        	        		s6=str[ysvn(s4.charAt(s4.length()-1),s1)][ysvt(s3.charAt(0),s2)].toString();
        	        		System.out.print(num+"          ");
        	        		System.out.print(s4+"      ");
        	        		System.out.print(s3+"      ");
        	        		System.out.println(s4.charAt(s4.length()-1)+"->"+s6);
        	        		s5=dz(s6).toString();
        	        		pt1[number]=""+s4.charAt(s4.length()-1);
        	        		pt2[number]=""+s6;
        	        		int k=s4.length();
        	        		s4=s4.substring(0,k-1);
        	        		s4=s4.concat(s5);
        	        		i=i-1;
        	        	}
        			}
    	        }
            }
        }
	}
	public int ysvn(char c,String s)
	{
		int k=0;
		for(int i=0;i<s.length();i++)
		{
			if(c==s.charAt(i))
			{
				k=i;
				break;
			}
		}
		return k;
	}
	public int ysvt(char c,String s)
	{
		int k=0;
		for(int i=0;i<s.length();i++)
		{
			if(c==s.charAt(i))
			{
				k=i;
				break;
			}
		}
		return k;
	}
	public String dz(String s)
	{
		String str="";
		for(int i=0;i<s.length();i++)
		{
			str=str+s.charAt(s.length()-i-1);
		}
		return str;
	}
	public void yz(String s1,String s2)
	{
		if(s2.indexOf("#")==-1)
        {
        	System.out.println("终结符中没有包含#号");
        	System.exit(0);
        }
		for(int i=0;i<s1.length();i++)
		{
			for(int j=0;j<s2.length();j++)
			{
				if(s1.charAt(i)==s2.charAt(j))
				{
					System.out.println("终结符与非终结符中有相同符号");
					System.exit(0);
				}
				else
					continue;
			}
		}
		for(int i=0;i<s1.length();i++)
		{
			for(int j=i+1;j<s1.length();j++)
			{
				if(s1.charAt(i)==s1.charAt(j))
				{
					System.out.println("非终结符中有重复的符号");
					System.exit(0);
				}
				else
					continue;
			}
		}
		for(int i=0;i<s2.length();i++)
		{
			for(int j=i+1;j<s2.length();j++)
			{
				if(s2.charAt(i)==s2.charAt(j))
				{
					System.out.println("终结符中有重复的符号");
					System.exit(0);
				}
				else
					continue;
			}
		}
	}
	public void paint(Graphics g)
	{
			for(int i=0;i<number+1;i++)
			{
				if(i==0)
				{
					g.drawString(pt1[0], (i+1)*50, (i+1)*50);
					for(int j=0;j<pt2[i].length();j++)
					{
						g.drawString(pt2[i].substring(j,j+1), (j+1)*50, (i+2)*50);
						g.drawLine((i+1)*50, (i+1)*50-1, (j+1)*50+1, (i+2)*50-1);
					}
				}
				else
				{
					if(pt2[i-1].indexOf(pt1[i])!=-1)
					{
						for(int m=0;m<pt2[i].length();m++)
						{
							g.drawString(pt2[i].substring(m,m+1),(m+1)*50,(i+2)*50);
							g.drawLine((pt2[i-1].indexOf(pt1[i])+1)*50, (i+1)*50-1, (m+1)*50+1, (i+2)*50-1);
						}
						continue;
					}
					else 
						System.exit(0);
				}
			}
			g.drawString("语法树如上图所示", 100, 600);
	}
}

⌨️ 快捷键说明

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