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

📄 compilesystem.java

📁 问题描述 设计一个由正规文法生成First集和Follow集并进行简化的算法动态模拟。(算法参见教材) 【基本要求】 动态模拟算法的基本功能是: (1) 输入一个文法G; (2) 输
💻 JAVA
字号:
package sun.chenzhipeng.main;

import java.awt.Color;
import java.awt.FileDialog;
import java.awt.Font;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.PopupMenu;
import java.awt.Rectangle;
import java.awt.SystemTray;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import java.awt.Dimension;
import javax.swing.JTextArea;
import java.awt.Button;

public class CompileSystem extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JLabel jLabel = null;
	private JTextField JTRegularInput = null;
	private JButton BTAnalysisFromFile = null;
	private JButton chooseFile = null;
	MenuItem item1 = null, item2 = null; // @jve:decl-index=0:
	TrayIcon trayIcon = null; // @jve:decl-index=0:
	private JTextField Regufile = null;
	private JButton BTAnalysisFromInput = null;
	private JScrollPane jScrollPane = null; // @jve:decl-index=0:visual-constraint="10,434"
	private JTable jTable = null;  //  @jve:decl-index=0:visual-constraint="-46,154"
	List list; // @jve:decl-index=0:
	DefaultTableModel dfm;
	private TextArea textArea = null;
	private JButton jButton = null;
	WenFaConvert wenfaconver;
    List inputList  = new LinkedList ();  //  @jve:decl-index=0:
    boolean flagClear = true;
	/**
	 * This method initializes jTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getJTextField() {
		if (JTRegularInput == null) {
			JTRegularInput = new JTextField();
			JTRegularInput.setBounds(new Rectangle(161, 37, 184, 24));
			JTRegularInput.setFont(new Font("Dialog", Font.BOLD, 14));
			JTRegularInput.setBackground(new Color(204, 255, 204));
			JTRegularInput.setName("regularChar");
		}
		return JTRegularInput;
	}

	/**
	 * This method initializes Analysis
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getAnalysis() {
		if (BTAnalysisFromFile == null) {
			BTAnalysisFromFile = new JButton();
			BTAnalysisFromFile.setBounds(new Rectangle(430, 4, 107, 23));
			BTAnalysisFromFile.setText("FIRST集");
		}
		return BTAnalysisFromFile;
	}

	/**
	 * This method initializes BTAnalysisFromInput
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBTAnalysisFromInput() {
		if (BTAnalysisFromInput == null) {
			BTAnalysisFromInput = new JButton();
			BTAnalysisFromInput.setBounds(new Rectangle(347, 38, 100, 22));
			BTAnalysisFromInput.setText("添加产生式");
		}
		return BTAnalysisFromInput;
	}

	/**
	 * This method initializes chooseFile
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getChooseFile() {
		if (chooseFile == null) {
			chooseFile = new JButton();
			chooseFile.setBounds(new Rectangle(12, 5, 142, 22));
			chooseFile.setName("BTfile");
			chooseFile.setText("从文件读取文法");
		}
		return chooseFile;
	}

	public CompileSystem() {
		super();
		initialize();
	}

	private void initialize() {
		if (SystemTray.isSupported()) {
			SystemTray tray = SystemTray.getSystemTray();

			Image image = Toolkit.getDefaultToolkit().getImage("/image/tuopan.jpeg");//获取一个图标对象
			PopupMenu popup = new PopupMenu();
			item1 = new MenuItem("关于作者");
			item2 = new MenuItem("退出系统");
			popup.add(item1);
			popup.add(item2);
			trayIcon = new TrayIcon(image, "我的编译原理课程设计", popup);
			trayIcon.addActionListener(this);
			try {
				tray.add(trayIcon);
				item1.addActionListener(this);
				item2.addActionListener(this);

				trayIcon.displayMessage("^-^", "我的编译课程设计!",
						TrayIcon.MessageType.INFO);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("系统不支持工具栏");
		}
		// 系统工具条代码
		this.setSize(550, 427);
		this.setResizable(false);
		this.setLocation(new Point(112, 156));
		this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/image/BMW.png")));
		this.setBackground(new Color(94, 32, 32));
		this.setTitle("正规文法First集Follow求解过程演示模拟 ");
		this.setVisible(true);
		this.setContentPane(getJContentPane());

	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabel = new JLabel();
			jLabel.setBounds(new Rectangle(13, 37, 140, 25));
			jLabel.setText("     请自定义文法");

			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.setToolTipText("我的编译原理课程设计");
			jContentPane.setName("CompileSystem");
			jContentPane.setFont(new Font("Dialog", Font.PLAIN, 12));
			jContentPane.add(jLabel, null);
			jContentPane.add(getJTextField(), null);
			jContentPane.add(getAnalysis(), null);
			jContentPane.add(getChooseFile(), null);
			jContentPane.add(getRegufile(), null);
			jContentPane.add(getBTAnalysisFromInput(), null);
			jContentPane.add(getTextArea(), null);
			jContentPane.add(getJButton(), null);
			BTAnalysisFromFile.addActionListener(this);
			chooseFile.addActionListener(this);
			JTRegularInput.addActionListener(this);
			BTAnalysisFromInput.addActionListener(this);
			jButton.addActionListener(this);
		}
		return jContentPane;
	}

	public void actionPerformed(ActionEvent e) {
		String regString = null;// 文法
        boolean flag = true;
		if (e.getSource() == chooseFile) { // 选择文件按钮
			FileDialog fileDialog = new FileDialog(this);
			fileDialog.setVisible(true);
			regString = fileDialog.getDirectory() + fileDialog.getFile();
			Regufile.setText(regString);
		}

		else if (e.getSource() == BTAnalysisFromFile) {
			if (BTAnalysisFromFile.getText().equals("FIRST集")) {
				
				// 分析从文件读取的文法
				// 开始分析文法,如果
				if (Regufile.getText().length() == 0) {
					JOptionPane.showMessageDialog(this, "请选择文件", "出错了", 0);
				} else if (!Regufile.getText().trim().endsWith(".txt")) {
					JOptionPane.showMessageDialog(this,
							"无法从选择的文件获取文法,请将文法定义到txt文件中", "出错了", 0);
				} else {
					BTAnalysisFromFile.setText("FOLLOW集");
					textArea.setText(null);
					File file = new File(Regufile.getText());
					Regufile.setText("");
					String readLine;
					BufferedReader reader;
					try {
						reader = new BufferedReader(new FileReader(file));
						 list= new LinkedList();
						textArea.append("从文件读取到的文法G定义规则如下" + "\n\n");
						while ((readLine = reader.readLine()) != null) {
							list.add(readLine.trim());
							textArea.append(readLine + "\n");
						}
						// System.out.println("共有" + list.size() + "条产生式");
						textArea.append("\n");
						wenfaconver = new WenFaConvert(list);
						List list3 = wenfaconver.getVnList();// 非终结符集
						String vn = null;

						for (int i = 0; i < list3.size(); i++) {
							// 这个算法有点欠缺,需要改进
							vn = (String) list3.get(i);
							wenfaconver.First(vn, null, false);
						}

						String Header[] = MyUtils.convert(wenfaconver
								.getVtList(), "First集");
						// System.out.println("Header的长度是"+Header.length);
						// for(int k=0;k<Header.length;k++){
						// System.out.println(Header[k]);
						// }
						dfm = new DefaultTableModel(Header, 0);

						// TextArea textArea = new TextArea ();

						for (int i = 0; i < list3.size(); i++) {
							// 这个算法有点欠缺,需要改进
							vn = (String) list3.get(i);
							List l = wenfaconver.First(vn, textArea, true);
							String rowStr[] = MyUtils.convert(l, Header, vn);
							dfm.addRow(rowStr);
						}

						// jContentPane.add(textArea);

						jTable = getJTable();
						jTable.setModel(dfm);
						jScrollPane = getJScrollPane();
						jContentPane.add(jScrollPane, null);

					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e2) {
						e2.printStackTrace();
					}
				}
			} else {// 求Follow集合
				BTAnalysisFromFile.setText("FIRST集");
				jContentPane.remove(jScrollPane);
				jTable.removeAll();
				textArea.setText(null);
				jScrollPane.updateUI();
				String Header[] = MyUtils.convert(wenfaconver.getVtList(),
						"Follw集");
for(int i=0;i<Header.length;i++){
	if(Header[i].equals("ε")){
		Header[i]="#";
	}
}
				dfm = new DefaultTableModel(Header, 0);
				String vn;
				List list3 = wenfaconver.getVnList();// 非终结符集
				for (int i = 0; i < list3.size(); i++) {
					// 这个算法有点欠缺,需要改进
					vn = (String) list3.get(i);
					List l = wenfaconver.Follow(vn, true, textArea);
					String rowStr[] = MyUtils.convert(l, Header, vn);
					dfm.addRow(rowStr);
				}

				jTable = getJTable();
				jTable.setModel(dfm);
				jScrollPane = getJScrollPane();
				jContentPane.add(jScrollPane, null);

			}

		} else if (e.getSource() == BTAnalysisFromInput
				|| e.getSource() == JTRegularInput) {
			if(flagClear==true){
				textArea.setText("");
				flagClear = false;
			}
			if (JTRegularInput.getText().length() == 0) {
				JOptionPane.showMessageDialog(this, "请输入要分析的文法", "出错了", 0);
			} else {
				String str = JTRegularInput.getText();
				inputList.add(JTRegularInput.getText());
				textArea.append("添加了一条产生式"+str+"\n");
				JTRegularInput.setText("");
			}
		}else if(e.getSource()==jButton){
			
			if (jButton.getText().equals("FIRST集")) {

					jButton.setText("FOLLOW集");
					textArea.setText(null);
				
						wenfaconver = new WenFaConvert(inputList);
						inputList.clear();
						List list3 = wenfaconver.getVnList();// 非终结符集
						String vn = null;

						for (int i = 0; i < list3.size(); i++) {
							// 这个算法有点欠缺,需要改进
							vn = (String) list3.get(i);
							wenfaconver.First(vn, null, false);
						}

						String Header[] = MyUtils.convert(wenfaconver
								.getVtList(), "First集");
						dfm = new DefaultTableModel(Header, 0);
						for (int i = 0; i < list3.size(); i++) {
							// 这个算法有点欠缺,需要改进
							vn = (String) list3.get(i);
							List l = wenfaconver.First(vn, textArea, true);
							String rowStr[] = MyUtils.convert(l, Header, vn);
							dfm.addRow(rowStr);
						}

						jTable = getJTable();
						jTable.setModel(dfm);
						jScrollPane = getJScrollPane();
						jContentPane.add(jScrollPane, null);
			} else {// 求Follow集合
				jButton.setText("FIRST集");
				flagClear= true;
				jContentPane.remove(jScrollPane);
				jTable.removeAll();
				textArea.setText(null);
				jScrollPane.updateUI();
				String Header[] = MyUtils.convert(wenfaconver.getVtList(),
						"Follw集");
for(int i=0;i<Header.length;i++){
	if(Header[i].equals("ε")){
		Header[i]="#";
	}
}
				dfm = new DefaultTableModel(Header, 0);
				String vn;
				List list3 = wenfaconver.getVnList();// 非终结符集
				for (int i = 0; i < list3.size(); i++) {
					// 这个算法有点欠缺,需要改进
					vn = (String) list3.get(i);
					List l = wenfaconver.Follow(vn, true, textArea);
					String rowStr[] = MyUtils.convert(l, Header, vn);
					dfm.addRow(rowStr);
				}

				jTable = getJTable();
				jTable.setModel(dfm);
				jScrollPane = getJScrollPane();
				jContentPane.add(jScrollPane, null);

				
				
			}

		
		}

		else if (e.getSource() == item1) {
			JOptionPane.showMessageDialog(this,
					"05项目管理4班 陈志鹏 20052110011025", "关于本软件作者", 1);
		} else if (e.getSource() == item2) {
			if (JOptionPane.showConfirmDialog(this, "您确定要退出系统", "退出系统", 1) == 0) {
				System.exit(0);
			}
		} else if (e.getSource() == trayIcon) {
			this.show();
		}

	}

	/**
	 * This method initializes Regufile
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getRegufile() {
		if (Regufile == null) {
			Regufile = new JTextField();
			Regufile.setBounds(new Rectangle(159, 3, 259, 25));
			Regufile.setEditable(true);
			Regufile.setBackground(new Color(204, 255, 204));
			Regufile.setFont(new Font("Dialog", Font.BOLD, 12));
		}
		return Regufile;
	}

	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane(jTable);
			jScrollPane.setBounds(new Rectangle(12, 73, 499, 136));
			// jScrollPane.setViewportView(jTable);
			jScrollPane.setBackground(new Color(153, 0, 153));
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTable
	 * 
	 * @return javax.swing.JTable
	 */
	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable();
			jTable.setEnabled(false);
			jTable.setBackground(new Color(204, 255, 204));
			// jTable.setModel(dfm);
			jTable.setFont(new Font("Dialog", Font.PLAIN, 12));
		}
		return jTable;
	}

	/**
	 * This method initializes textArea
	 * 
	 * @return java.awt.TextArea
	 */
	private TextArea getTextArea() {
		if (textArea == null) {
			textArea = new TextArea();
			textArea.setBounds(new Rectangle(3, 216, 529, 173));
			textArea.setBackground(new Color(204, 255, 204));
			textArea.setEditable(false);
			textArea.setFont(new Font("Dialog", Font.BOLD, 14));
		}
		return textArea;
	}

	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(454, 36, 82, 24));
			jButton.setText("FIRST集");
		}
		return jButton;
	}

	public static void main(String[] args) {

		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				CompileSystem thisClass = new CompileSystem();
				thisClass.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

} 

⌨️ 快捷键说明

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