?? assembler.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 + -