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

📄 initjframe.java

📁 北航编译原理课程设计成果——一个扩充的C0文法编译器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
																		.createSequentialGroup()
																		.addGap(
																				355,
																				355,
																				355)
																		.addComponent(
																				exitButton)))
										.addContainerGap()));
		layout
				.setVerticalGroup(layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								layout
										.createSequentialGroup()
										.addComponent(
												mainPanel,
												javax.swing.GroupLayout.DEFAULT_SIZE,
												javax.swing.GroupLayout.DEFAULT_SIZE,
												Short.MAX_VALUE)
										.addPreferredGap(
												javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(exitButton)));

		pack();
	}// </editor-fold>
	//GEN-END:initComponents

	private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {
		// TODO add your handling code here:
	}

	protected void initButtonActionPerformed(ActionEvent evt) {
		// TODO Auto-generated method stub

	}

	protected void chooseTextFieldActionPerformed(ActionEvent evt) {
		// TODO Auto-generated method stub

	}

	protected void openButtonActionPerformed(ActionEvent evt) {
		// TODO Auto-generated method stub

	}

	protected void compileButtonActionPerformed(ActionEvent evt) {
		// TODO Auto-generated method stub

	}

	private void exitButtonMouseClicked(java.awt.event.MouseEvent evt) {
		// TODO add your handling code here:

		System.exit(0);
	}

	private void initButtonMouseClicked(java.awt.event.MouseEvent evt) {
		// TODO add your handling code here:

		chooseTextField.setText("");
		fileTextArea.setText("");
		quaternionTextArea.setText("");
		assembleTextArea.setText("");
		errorTextArea.setText("");
		sourcefilepath = "";
		outputfilepath = "";
		file = null;
		openButton.setEnabled(true);
		compileButton.setEnabled(true);
	}

	private void compileButtonMouseClicked(java.awt.event.MouseEvent evt) {
		// TODO add your handling code here:

		if (file == null || !file.exists()) {
			JOptionPane.showMessageDialog(mainPanel, "您还未选择输入文件!");
			return;
		}
		int flag = JOptionPane.showConfirmDialog(mainPanel, "是否对中间代码进行优化处理?");

		if (flag == JOptionPane.YES_OPTION) {
			outputfilepath = sourcefilepath.substring(0, sourcefilepath
					.lastIndexOf('.'))
					+ "(optimized).asm";
			OptimizedCompileInput();
		} else if (flag == JOptionPane.NO_OPTION) {
			outputfilepath = sourcefilepath.substring(0, sourcefilepath
					.lastIndexOf('.'))
					+ ".asm";
			compileInput();
		} else
			return;
		compileButton.setEnabled(false);
	}

	private void openButtonMouseClicked(java.awt.event.MouseEvent evt) {
		// TODO add your handling code here:

		JFileChooser chooser = new JFileChooser();
		chooser.setMultiSelectionEnabled(false);

		if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
			sourcefilepath = chooser.getSelectedFile().getAbsolutePath();
			chooseTextField.setText(sourcefilepath);
		}

		file = new File(sourcefilepath);
		if (!file.exists()) {
			return;
		}
		String str;

		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			int n = 1;

			while ((str = reader.readLine()) != null) {
				fileTextArea.append((n++) + ":\t" + str + "\n");
			}

			reader.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		openButton.setEnabled(false);
	}

	/**
	 * 未经过优化处理的目标代码输出
	 */
	private void compileInput() {
		Lex lex = new Lex(file);
		lex.analyze();
		for (Output l : lex.getList()) {
			System.out.println(l.getLine() + " " + l.getType() + " "
					+ l.getWord());
		}

		if (lex.isError()) {
			for (int i = 0; i < lex.errorList.size(); i++) {
				errorTextArea.append(lex.errorList.get(i) + "\n");
			}
		} else {
			Yacc yacc = new Yacc(lex.getList());
			yacc.parseProgram();
			if (yacc.isError()) {
				for (String error : yacc.errorList) {
					errorTextArea.append(error + "\n");
					System.out.println(error);
				}
			} else {

				//中间代码(四元式)输出
				quaternionTextArea.append("GLOBAL_CONST:\n");
				for (Constant con : yacc.getGlobal_const()) {
					quaternionTextArea
							.append("const\t" + con.toString() + "\n");
				}
				quaternionTextArea.append("GLOBAL_VAR:\n");
				for (String var : yacc.getGlobal_var()) {
					quaternionTextArea.append("int\t" + var + "\n");
				}
				quaternionTextArea
						.append("==========================================\n");
				for (Function func : yacc.getFuncList()) {
					quaternionTextArea.append("FUNCTION:\n");
					quaternionTextArea
							.append("==========================================\n");
					quaternionTextArea.append(func.getRetype() + "\t"
							+ func.getName() + "\n");
					quaternionTextArea.append("PARA:\n");
					for (String para : func.getPara()) {
						quaternionTextArea.append("int\t" + para + "\t"
								+ func.getPmap().get(para) + "\n");
					}
					quaternionTextArea.append("CONST:\n");
					for (Constant con : func.getConst()) {
						quaternionTextArea.append("const\t" + con.toString()
								+ "\n");
					}
					quaternionTextArea.append("VAR:\n");
					for (String var : func.getVar()) {
						quaternionTextArea.append("int\t" + var + "\t"
								+ func.getVmap().get(var) + "\n");
					}
					for (Quaternion quater : func.getQuaterList()) {
						if (quater.getResult() != null
								&& quater.getResult().startsWith("@")) {
							quaternionTextArea.append("int\t"
									+ quater.getResult() + "\t"
									+ func.getVmap().get(quater.getResult())
									+ "\n");
						}
					}
					quaternionTextArea.append("QUATERNION:\n");
					quaternionTextArea
							.append("==========================================\n");
					for (Quaternion quater : func.getQuaterList()) {
						quaternionTextArea.append(quater.toString() + "\n");
					}
				}

				//汇编代码输出
				Assembler asm = new Assembler(yacc.getGlobal_const(), yacc
						.getGlobal_var(), yacc.getFuncList(), outputfilepath);
				asm.generateCode();
				assembleTextArea.append(".386\n");
				assembleTextArea.append(".MODEL FLAT\n");
				assembleTextArea.append("includelib msvcrt.lib\n");
				assembleTextArea.append("puts proto C\n");
				assembleTextArea.append("printf proto C\n");
				assembleTextArea.append("scanf proto C\n");
				assembleTextArea.append(".STACK 4096\n");
				assembleTextArea.append(".DATA\n");
				for (String var : asm.getGlobal_var()) {
					assembleTextArea.append("$" + var + " DWORD 0\n");
				}
				for (String s : asm.getStrlist()) {
					assembleTextArea.append(s + '\n');
				}
				assembleTextArea.append(".CODE\n");
				for (String str : asm.getOutput()) {
					assembleTextArea.append(str + '\n');
				}
				assembleTextArea.append("_main:\n");
				assembleTextArea.append("jmp near ptr @fmain\n");
				assembleTextArea.append("end _main\n");
				//结果输出
				if (asm.getWarn() != null) {
					errorTextArea.append(asm.getWarn() + "\n");
				}

				errorTextArea.append("编译成功,已生成X86汇编。" + "\n");
			}

			for (Function func : yacc.getFuncList()) {
				System.out.println(func.getName());
				for (String para : func.getPara()) {
					System.out.print("\t" + para);
				}
				System.out.println("");
				for (Quaternion quater : func.getQuaterList()) {
					System.out.println(quater.getOperator() + "\t"
							+ quater.getOperend1() + "\t"
							+ quater.getOperend2() + "\t" + quater.getResult());
				}
			}
		}
	}

	/**
	 * 经过优化处理的目标代码输出
	 */
	private void OptimizedCompileInput() {
		Lex lex = new Lex(file);
		lex.analyze();
		for (Output l : lex.getList()) {
			System.out.println(l.getLine() + " " + l.getType() + " "
					+ l.getWord());
		}

		if (lex.isError()) {
			for (int i = 0; i < lex.errorList.size(); i++) {
				errorTextArea.append(lex.errorList.get(i) + "\n");
			}
		} else {
			Yacc yacc = new Yacc(lex.getList());
			yacc.parseProgram();
			if (yacc.isError()) {
				for (String error : yacc.errorList) {
					errorTextArea.append(error + "\n");
					System.out.println(error);
				}
			} else {
				//优化处理
				Optimizer opti = new Optimizer(yacc.getFuncList());
				opti.process();
				yacc.setFuncList(opti.getFuncList());

				//中间代码(四元式)输出
				quaternionTextArea.append("GLOBAL_CONST:\n");
				for (Constant con : yacc.getGlobal_const()) {
					quaternionTextArea
							.append("const\t" + con.toString() + "\n");
				}
				quaternionTextArea.append("GLOBAL_VAR:\n");
				for (String var : yacc.getGlobal_var()) {
					quaternionTextArea.append("int\t" + var + "\n");
				}
				quaternionTextArea
						.append("==========================================\n");
				for (Function func : yacc.getFuncList()) {
					quaternionTextArea.append("FUNCTION:\n");
					quaternionTextArea
							.append("==========================================\n");
					quaternionTextArea.append(func.getRetype() + "\t"
							+ func.getName() + "\n");
					quaternionTextArea.append("PARA:\n");
					for (String para : func.getPara()) {
						quaternionTextArea.append("int\t" + para + "\t"
								+ func.getPmap().get(para) + "\n");
					}
					quaternionTextArea.append("CONST:\n");
					for (Constant con : func.getConst()) {
						quaternionTextArea.append("const\t" + con.toString()
								+ "\n");
					}
					quaternionTextArea.append("VAR:\n");
					for (String var : func.getVar()) {
						quaternionTextArea.append("int\t" + var + "\t"
								+ func.getVmap().get(var) + "\n");
					}
					for (Quaternion quater : func.getQuaterList()) {
						if (quater.getResult() != null
								&& quater.getResult().startsWith("@")) {
							quaternionTextArea.append("int\t"
									+ quater.getResult() + "\t"
									+ func.getVmap().get(quater.getResult())
									+ "\n");
						}
					}
					quaternionTextArea.append("QUATERNION:\n");
					quaternionTextArea
							.append("==========================================\n");
					for (Quaternion quater : func.getQuaterList()) {
						quaternionTextArea.append(quater.toString() + "\n");
					}
				}

				//汇编代码输出
				Assembler asm = new Assembler(yacc.getGlobal_const(), yacc
						.getGlobal_var(), yacc.getFuncList(), outputfilepath);
				asm.generateCode();
				assembleTextArea.append(".386\n");
				assembleTextArea.append(".MODEL FLAT\n");
				assembleTextArea.append("includelib msvcrt.lib\n");
				assembleTextArea.append("puts proto C\n");
				assembleTextArea.append("printf proto C\n");
				assembleTextArea.append("scanf proto C\n");
				assembleTextArea.append(".STACK 4096\n");
				assembleTextArea.append(".DATA\n");
				for (String var : asm.getGlobal_var()) {
					assembleTextArea.append("$" + var + " DWORD 0\n");
				}
				for (String s : asm.getStrlist()) {
					assembleTextArea.append(s + '\n');
				}
				assembleTextArea.append(".CODE\n");
				for (String str : asm.getOutput()) {
					assembleTextArea.append(str + '\n');
				}
				assembleTextArea.append("_main:\n");
				assembleTextArea.append("jmp near ptr @fmain\n");
				assembleTextArea.append("end _main\n");
				//结果输出
				if (asm.getWarn() != null) {
					errorTextArea.append(asm.getWarn() + "\n");
				}

				errorTextArea.append("编译成功,已生成X86汇编。" + "\n");
			}

			for (Function func : yacc.getFuncList()) {
				System.out.println(func.getName());
				for (String para : func.getPara()) {
					System.out.print("\t" + para);
				}
				System.out.println("");
				for (Quaternion quater : func.getQuaterList()) {
					System.out.println(quater.getOperator() + "\t"
							+ quater.getOperend1() + "\t"
							+ quater.getOperend2() + "\t" + quater.getResult());
				}
			}
		}
	}

	/**
	 * @param args the command line arguments
	 */
	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				new InitJFrame().setVisible(true);
			}
		});
	}

	//GEN-BEGIN:variables
	// Variables declaration - do not modify
	private javax.swing.JLabel assembleLabel;
	private javax.swing.JTextArea assembleTextArea;
	private javax.swing.JLabel chooseLabel;
	private javax.swing.JTextField chooseTextField;
	private javax.swing.JButton compileButton;
	private javax.swing.JLabel errorLabel;
	private javax.swing.JTextArea errorTextArea;
	private javax.swing.JButton exitButton;
	private javax.swing.JTextArea fileTextArea;
	private javax.swing.JButton initButton;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JScrollPane jScrollPane2;
	private javax.swing.JScrollPane jScrollPane3;
	private javax.swing.JScrollPane jScrollPane4;
	private javax.swing.JPanel mainPanel;
	private javax.swing.JButton openButton;
	private javax.swing.JLabel quaternionLabel;
	private javax.swing.JTextArea quaternionTextArea;
	private javax.swing.JLabel titleLabel;
	// End of variables declaration//GEN-END:variables

}

⌨️ 快捷键说明

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