📄 initjframe.java
字号:
.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 + -