编译原理·Java实现语法分析:LL1文法(GUI实现界面)
1. 话不多说,先上代码
package ll1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.sql.*;
import java.util.Vector;
public class LL1 extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
JTextField tf1;
JTextField tf2;
JLabel l;
JPanel p1,p2,p3;
JTextArea t1,t2,t3;
JButton b0,b1,b2,b3;
JLabel l0,l1,l2,l3,l4;
JTable table;
Statement sta;
Connection conn;
ResultSet rs;
DefaultTableModel dtm;
String Vn[]=null;
Vector<String> P=null;
int firstComplete[]=null;
char first[][]=null;
int followComplete[]=null;
char follow[][]=null;
char select[][]=null;
int LL=0;
String vt_tou[]=null;
Object shuju[][]=null;
char yn_null[]=null;
LL1()
{
setLocation(200,0);
setSize(700,710);
tf1=new JTextField(13);
tf2=new JTextField(13);
l=new JLabel(">>");
l0=new JLabel("输入字符串:");
l1=new JLabel("输入的文法: ");
l2=new JLabel(" ");
l3=new JLabel("分析的结果: ");
l4=new JLabel("预测分析表: ");
p1=new JPanel();
p2=new JPanel();
p3=new JPanel();
t1=new JTextArea(22,30);
t2=new JTextArea(2,30);
t3=new JTextArea(22,30);
b0=new JButton(" 文 法 确 定 ");
b1=new JButton(" 文 法 判 断 ");
b2=new JButton("输入");
b3=new JButton("清空");
table=new JTable();
JScrollPane jp1=new JScrollPane(t1);
JScrollPane jp2=new JScrollPane(t2);
JScrollPane jp3=new JScrollPane(t3);
p2.add(tf1);
p2.add(l);
p2.add(tf2);
p2.add(b0);
p2.add(b1);
p2.add(l0);
p2.add(l2);
p2.add(jp2);
p2.add(b2);
p2.add(b3);
p2.add(l1);
p2.add(l3);
p2.add(jp1);
p3.add(l4);
p2.add(jp3);
p3.add(new JScrollPane(table));
add(p2,"Center");
add(p3,"South");
b0.addActionListener(this);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table.setPreferredScrollableViewportSize(new Dimension(660,200));
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==b0)
{
String a=tf1.getText();
String b=tf2.getText();
t1.append(a+'→'+b+'\n');
}
if(e.getSource()==b1)
{
t3.setText("");
int Vnnum=0,k;
Vn=new String[100];
P=new Vector<String>();
String s[]=t1.getText().split("\n");
for(int i=0;i<s.length;i++)
{
if(s.length<2){
t3.setText("文法输入有误,请重新输入");
return;
}
if(s[i].charAt(0)<='Z'&&s[i].charAt(0)>='A'&&s[i].charAt(1)=='→')
{
for(k=0;k<Vnnum;k++)
{
if(Vn[k].equals(s[i].substring(0, 1))){
break;
}
}
if(Vnnum==0||k>=Vnnum)
{
Vn[Vnnum]=s[i].substring(0, 1);
Vnnum++;
}
P.add(s[i]);
}
else
{
t3.setText("文法输入有误,请重新输入");
return;
}
}
yn_null=new char[100];
first=new char[Vnnum][100];
int flag=0;
String firstVn[]=null;
firstComplete=new int[Vnnum];
for(int i=0;Vn[i]!=null;i++)
{
flag=0;
firstVn=new String[20];
if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;
firstComplete[i]=1;
}
t3.append("first集:"+"\n");
for(int i=0;Vn[i]!=null;i++)
{
t3.append("first("+Vn[i]+")={ ");
for(int j=0;first[i][j]!='\0';j++)
{
t3.append(first[i][j]+" , ");
}
t3.append("}"+"\n");
}
follow=new char[Vnnum][100];
String followVn[]=null;
followComplete=new int[Vnnum];
for(int i=0;Vn[i]!=null;i++)
{
flag=0;
followVn=new String[20];
if((flag=tianjiaFollow(follow[i],Vn[i],followVn,flag))==-1)return;
followComplete[i]=1;
}
t3.append("follow集:"+"\n");
for(int i=0;Vn[i]!=null;i++)
{
t3.append("follow("+Vn[i]+")={ ");
for(int j=0;follow[i][j]!='\0';j++)
{
t3.append(follow[i][j]+" , ");
}
t3.append("}"+"\n");
}
select=new char[P.size()][100];
for(int i=0;i<P.size();i++)
{
flag=0;
tianjiaSelect(select[i],(String)P.elementAt(i),flag);
}
t3.append("select集:"+"\n");
for(int i=0;i<P.size();i++)
{
t3.append("select("+(String)P.elementAt(i)+")={ ");
for(int j=0;select[i][j]!='\0';j++)