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

📄 assembler.java

📁 java语言开发的基于tiny语言的编译器
💻 JAVA
字号:

package jeex.tiny;

import java.io.*;
import java.util.List;

/**
 * Assembler loads a program in a text file writing 
 * with assembly language into a CodeArea.
 */
class Assembler {
   /**
    * Load program from text file.
    * @param file -- the input file
    * @return an newly created CodeArea.
    */
	static CodeArea loadProgram(String file) 
			throws IOException {
		CodeArea codes = new CodeArea();
		LineNumberReader reader 
			= new LineNumberReader(new FileReader(file));
		String text = reader.readLine();
		while(text != null) {
			Instruction instr = parse(text.trim());
			if (instr != null) {
				codes.addInstr(instr);
			}
			text = reader.readLine();
		}
		reader.close();
		return codes;
	}
	
	static CodeArea loadProgram(List list) {
		CodeArea codes = new CodeArea();
		for(int i = 0; i < list.size(); i++) {
			Instruction instr = parse(((String)list.get(i)).trim());
			if (instr != null) {
				codes.addInstr(instr);
			}
		}
		return codes;
	}
	/**
	 * Analyse a line of file called by loadProgram.
	 */
	static private Instruction parse(String text) {
		if (text.startsWith("*")) return null; // skip comments
		int cp = text.indexOf(";"); 
		if (cp > 0)
			text = text.substring(0,cp).trim();
		//take operator part
		int index = text.indexOf(" ");
		String op = index < 0 ? 
				text.substring(0).trim()
					:text.substring(0,index).trim();
		if (op.equals("LD")) {
			return new LDInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("LDA")) {
			return new LDAInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op .equals("LDC")) {
			return new LDCInstr(getOperand1(text),getOperand2(text));
		} else if(op.equals("ST")) {
			return new STInstr(getOperand1(text),getOperand2(text),getOperand3(text));		
		} else if(op.equals("JLT")) {
			return new JLTInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("JLE")) {
			return new JLEInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("JGE")) {
			return new JGEInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("JGT")) {
			return new JGTInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("JEQ")) {
			return new JEQInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("JNE")) {
			return new JNEInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("HALT")) {
			return new HALTInstr();
		} else if(op.equals("IN")) {
			return new INInstr(getOperand1(text));
		} else if(op.equals("OUT")) {
			return new OUTInstr(getOperand1(text));
		} else if(op.equals("ADD")) {
			return new ADDInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("SUB")) {
			return new SUBInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("MUL")) {
			return new MULInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else if(op.equals("DIV")) {
			return new DIVInstr(getOperand1(text),getOperand2(text),getOperand3(text));
		} else {
			System.out.println("Unknown instruction:" + op);
			return null;
		}
	}
	/**
	 * Take the first operand of an instruction.
	 */
	static private int getOperand1(String text) {
		int index = text.indexOf(" ");
		int index2 = text.indexOf(",");
		String s = index2 < 0 ? 
			text.substring(index + 1).trim()
				:text.substring(index + 1,index2).trim();
		return Integer.valueOf(s).intValue();
	}
	/**
	 * Take the second operand of an instruction.
	 */	
	static private int getOperand2(String text) {
		int index = text.indexOf(",");
		int index2 = text.indexOf("," , index + 1);
		if (index2 < 0) index2 = text.indexOf("(");
		String s = index2 < 0 ? 
				text.substring(index + 1).trim()
					:text.substring(index + 1,index2).trim();
				
		return Integer.valueOf(s).intValue();
	}
	/**
	 * Take the third operand of an instruction.
	 */	
	static private int getOperand3(String text) {
		int index = text.indexOf(",");
		int index2 = text.indexOf("," , index + 1);
		String s = null;
		if (index2 < 0) {
			index2 = text.indexOf("(" , index + 1);
			int index3 = text.indexOf(")" , index + 1);
			s = text.substring(index2 + 1,index3).trim();
		} else {
			s = text.substring(index2 + 1).trim();
		}
		return Integer.valueOf(s).intValue();
	}
	
}


⌨️ 快捷键说明

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