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

📄 initjframe.java

📁 北航编译原理课程设计成果——一个扩充的C0文法编译器
💻 JAVA
字号:
package cn.edu.buaa.scse.liyi.test;

import java.io.File;
import javax.swing.JFileChooser;

/**
 *
 * @author  liyi
 */

public class InitJFrame extends javax.swing.JFrame
{
	private static final long serialVersionUID=1L;
	
	private String sourcefilepath;
	private String outputfilepath;
	
	// Variables declaration - do not modify//GEN-BEGIN:variables
	private java.awt.Button button1;
	private java.awt.Button button2;
	private java.awt.Label label1;
	private java.awt.TextArea textArea1;
	private java.awt.TextArea textArea2;
	private java.awt.TextArea textArea3;
	private java.awt.TextField textField1;
	// End of variables declaration//GEN-END:variables
	
	public InitJFrame()
	{
		initComponents();
	}
	
	// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
	private void initComponents()
	{

		textField1=new java.awt.TextField();
		button1=new java.awt.Button();
		button2=new java.awt.Button();
		textArea1=new java.awt.TextArea();
		textArea2=new java.awt.TextArea();
		textArea3=new java.awt.TextArea();
		label1=new java.awt.Label();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

		textField1.setText("请选择输入文件");

		button1.setLabel("打开");
		button1.addMouseListener(new java.awt.event.MouseAdapter()
		{
			public void mouseClicked(java.awt.event.MouseEvent evt)
			{
				button1MouseClicked(evt);
			}
		});

		button2.setLabel("编译");
		button2.addMouseListener(new java.awt.event.MouseAdapter()
		{
			public void mouseClicked(java.awt.event.MouseEvent evt)
			{
				button2MouseClicked(evt);
			}
		});

		textArea1.setName("fouroutput"); // NOI18N

		textArea2.setName("assembleroutput"); // NOI18N

		label1.setText("C0文法编译器");

		org.jdesktop.layout.GroupLayout layout=new org.jdesktop.layout.GroupLayout(getContentPane());
		getContentPane().setLayout(layout);
		layout.setHorizontalGroup(
			layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
			.add(layout.createSequentialGroup()
				.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
					.add(layout.createSequentialGroup()
						.addContainerGap()
						.add(textArea1,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,356,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
						.add(10,10,10)
						.add(textArea2,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,271,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
					.add(layout.createSequentialGroup()
						.addContainerGap()
						.add(textArea3,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,637,Short.MAX_VALUE)))
				.addContainerGap())
			.add(org.jdesktop.layout.GroupLayout.TRAILING,layout.createSequentialGroup()
				.addContainerGap()
				.add(label1,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
				.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED,208,Short.MAX_VALUE)
				.add(textField1,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,220,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
				.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
				.add(button1,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
				.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
				.add(button2,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
				.add(27,27,27))
		);
		layout.setVerticalGroup(
			layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
			.add(org.jdesktop.layout.GroupLayout.TRAILING,layout.createSequentialGroup()
				.addContainerGap()
				.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
					.add(layout.createSequentialGroup()
						.add(label1,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))
					.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
						.add(layout.createSequentialGroup()
							.add(textField1,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))
						.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
							.add(layout.createSequentialGroup()
								.add(button1,0,0,Short.MAX_VALUE)
								.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))
							.add(layout.createSequentialGroup()
								.add(button2,0,0,Short.MAX_VALUE)
								.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)))))
				.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
					.add(org.jdesktop.layout.GroupLayout.LEADING,textArea2,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,438,Short.MAX_VALUE)
					.add(org.jdesktop.layout.GroupLayout.LEADING,textArea1,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,438,Short.MAX_VALUE))
				.add(9,9,9)
				.add(textArea3,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
		);

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

	private void button1MouseClicked(java.awt.event.MouseEvent evt)
	{//GEN-FIRST:event_button1MouseClicked
		
		JFileChooser chooser=new JFileChooser();
		chooser.setMultiSelectionEnabled(false);
		if(chooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION)
		{
			sourcefilepath=chooser.getSelectedFile().getAbsolutePath();
			outputfilepath=sourcefilepath+".asm";
			textField1.setText(sourcefilepath);
		}
	}//GEN-LAST:event_button1MouseClicked

	private void button2MouseClicked(java.awt.event.MouseEvent evt)
	{//GEN-FIRST:event_button3MouseClicked
		
		File file=new File(sourcefilepath);
		Lex lx=new Lex(file);
		lx.analyze();
		
//		for(int i=0;i<lx.list.size();i++)
//		{
//			System.out.println(lx.list.get(i).type+" "+lx.list.get(i).word+"\n");
//		}
		
		if(lx.erroroutput!=null)
		{
			textArea3.append("词法分析错误:");
			textArea3.append(lx.erroroutput);
			return;
		}
		Compile cc=new Compile(lx.list);
		cc.Program();
		//打印
		if(cc.error==0)
		{
			//四元式输出
			textArea1.append("topconst:\n");
			for(Constpair pair:cc.topconst)
			{
				textArea1.append("const "+pair.toString()+"\n");
			}
			textArea1.append("topvar:\n");
			for(String ss:cc.topvar)
			{
				textArea1.append("int "+ss+"\n");
			}
			textArea1.append("===============================================\n");
			for(Function func:cc.funclist)
			{
				textArea1.append("FUNCTION:\n");
				textArea1.append("===============================================\n");
				textArea1.append(func.retype+" "+func.name+"\n");
				textArea1.append("PARA:\n");
				for(String para:func.para)
				{
					textArea1.append("int "+para+"\t"+func.pmap.get(para)+"\n");
				}
				textArea1.append("CONST:\n");
				for(Constpair pair:func.con)
				{
					textArea1.append("const "+pair.toString()+"\n");
				}
				textArea1.append("VAR:\n");
				for(String var:func.var)
				{
					textArea1.append("int "+var+"\t"+func.vmap.get(var)+"\n");
				}
				for(Quadruple f:func.fourlist)
				{
					if(f.result!=null&&f.result.startsWith("@"))
					{
						textArea1.append("int "+f.result+"\t"+func.vmap.get(f.result)+"\n");
					}
				}
				textArea1.append("FOUR:\n");
				textArea1.append("===============================================\n");
				for(Quadruple quadruple:func.fourlist)
				{
					textArea1.append(quadruple.toString()+"\n");
				}
			}
			//汇编输出
			Generate gen=new Generate(cc.topconst,cc.topvar,cc.funclist,outputfilepath);
			gen.Generate();
			textArea2.append(".386\n");
			textArea2.append(".MODEL FLAT\n");
			textArea2.append("includelib msvcrt.lib\n");
			textArea2.append("puts proto C\n");
			textArea2.append("printf proto C\n");
			textArea2.append("scanf proto C\n");
			textArea2.append(".STACK 4096\n");
			textArea2.append(".DATA\n");
			for(String s:gen.topvar)
			{
				textArea2.append("$"+s+" DWORD 0\n");
			}
			for(String s:gen.st)
			{
				textArea2.append(s+'\n');
			}
			textArea2.append(".CODE\n");
			for(String s:gen.assembler)
			{
				textArea2.append(s+'\n');
			}
			textArea2.append("_main:\n");
			textArea2.append("jmp near ptr @fmain\n");
			textArea2.append("end _main\n");
			//结果输出
			if(gen.warn!=null)
			{
				textArea3.append(gen.warn);
			}
			textArea3.append("成功生成汇编!");
		}
		else
		{
			textArea3.append("ERROR "+new Integer(cc.error).toString()+"\n");
			textArea3.append(cc.err_report(cc.error));
		}
	}//GEN-LAST:event_button3MouseClicked
	
	/**
	 * @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);
					}
				});
	}
}

⌨️ 快捷键说明

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