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