📄 byyl.java
字号:
import java.io.*;
import java.awt.datatransfer.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Byyl extends JFrame implements ActionListener{
public static int num=11;
public JButton btn1=new JButton("计算");
public JButton btn2=new JButton("保存");
public Choice chos[][];
private int a[][];
private int f[][];
public JPanel pn1,pn2;
String fileName="*.txt";
private FileDialog saveAsFileDialog=new FileDialog(this,"Save File As",FileDialog.LOAD);
public TextArea textarea=new TextArea("",15,30,TextArea.SCROLLBARS_BOTH);
public static void main(String[] args){
boolean pd1=true;
while(pd1){
Byyl mainFrame=new Byyl();
String nums;
nums=JOptionPane.showInputDialog("请输入终结符个数:(2至10之间)");
num=Integer.parseInt(nums);
if(num>=2&&num<=10){
mainFrame.setSize(600,600);
mainFrame.setTitle("编译原理");
mainFrame.create();
mainFrame.show();
pd1=false;
}
else
JOptionPane.showMessageDialog(null,"输入数值不合法,请重新输入!");
}
}
private void create(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window=getContentPane();
window.setLayout(new GridLayout(2,1));
pn1=new JPanel(new GridLayout(num+1,num));
chos=new Choice[num][num];
for(int i=0;i<num;i++)
for(int j=0;j<num;j++){
chos[i][j]=new Choice();
chos[i][j].add(" ");
chos[i][j].add("大于");
chos[i][j].add("小于");
chos[i][j].add("等于");
pn1.add(chos[i][j]);
}
pn1.add(btn1);
btn1.addActionListener(this);
pn1.add(btn2);
btn2.addActionListener(this);
window.add(pn1);
pn2=new JPanel();
BorderLayout border=new BorderLayout();
pn2.setLayout(border);
pn2.add(textarea,border.NORTH);
window.add(pn2);
}
public void actionPerformed(ActionEvent e){
boolean pd=true;
int k=0;
a=new int[num][num];
f=new int[2][num];
for(int i=0;i<num&&pd;i++)
for(int j=0;j<num;j++){
if(chos[i][j].getSelectedItem()=="小于")
a[i][j]=0;
else if(chos[i][j].getSelectedItem()=="等于")
a[i][j]=1;
else if(chos[i][j].getSelectedItem()=="大于")
a[i][j]=2;
else a[i][j]=4;
}
for(int i=0;i<2;i++)
for(int j=0;j<num;j++)
f[i][j]=1;
if(e.getSource()==btn1){
textarea.append("优先函数的初始值为1"+"\n");
for(int i=0;i<2;i++)
for(int j=0;j<num;j++){
textarea.append(Integer.toString(1));
textarea.append(" ");
if(j==num-1)
textarea.append("\n");
}
textarea.append("---------------------"+"\n");
while(k<8&&pd){
k++;
for(int i=0;i<num&&pd;i++)
for(int j=0;j<num&&pd;j++){
if(a[i][j]==2&&f[0][i]<=f[1][j]){
f[0][i]=f[1][j]+1;
textarea.append("第"+Integer.toString(i+1)+"个终结符a优先关系大于第"+Integer.toString(j+1)+
"\n"+"个终结符b,而其优先函数f(a)却小于或等于g(b),故"+"\n"+
"执行f(a)=g(b)+1操作。"+"\n"+"------------------"+"\n");
if(f[0][i]>2*num){
pd=false;
JOptionPane.showMessageDialog(null,"迭代过程中出现了优先函数值大于2n的情况!"+"\n"+"迭代过程结束!");
}
}
else if(a[i][j]==0&&f[0][i]>=f[1][j]){
f[1][j]=f[0][i]+1;
textarea.append("第"+Integer.toString(i+1)+"个终结符a优先关系小于于第"+Integer.toString(j+1)+
"\n"+"个终结符b,而其优先函数f(a)却大于于或等于g(b),故"+"\n"+
"执行g(b)=f(a)+1操作。"+"\n"+"------------------"+"\n");
if(f[1][j]>2*num){
pd=false;
JOptionPane.showMessageDialog(null,"迭代过程中出现了优先函数值大于2n的情况!"+"\n"+"迭代过程结束!");
}
}
else if(a[i][j]==1&&f[0][i]!=f[1][j]){
if(f[0][i]<f[1][j])
f[0][i]=f[1][j];
else f[1][j]=f[0][i];
textarea.append("第"+Integer.toString(i+1)+"个终结符a优先关系等于第"+Integer.toString(j+1)+
"\n"+"个终结符b,而其优先函数f(a)却不等于g(b),故"+"\n"+"执行min{f(a),f}操作。"+"\n"+"------------------"+"\n");
if(f[0][i]>2*num||f[1][j]>2*num){
pd=false;
JOptionPane.showMessageDialog(null,"迭代过程中出现了优先函数值大于2n的情况!"+"\n"+"迭代过程结束!");
}
}
}
textarea.append("第"+Integer.toString(k)+"次迭代的结果为:"+"\n");
for(int i=0;i<2;i++)
for(int j=0;j<num;j++){
textarea.append(Integer.toString(f[i][j]));
textarea.append(" ");
if(j==num-1)
textarea.append("\n");
}
textarea.append("---------------------"+"\n");
}
}
if(e.getSource()==btn2){
saveAsFileDialog.show();
fileName=saveAsFileDialog.getDirectory()+saveAsFileDialog.getFile();
if(fileName!=null)
writeFile(fileName);
}
}
public void writeFile(String fileName){
try{
File file = new File(fileName);
FileWriter writeOut = new FileWriter(file);
writeOut.write(textarea.getText());
writeOut.close();
}catch(IOException e){
System.out.println("Error writing file");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -