📄 fs.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 + -