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

📄 byyl.java

📁 此程序用于实现编译原理中算符优先文法中算符优先函数算法
💻 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 + -