所以我有這個編譯器類編譯一些.mjava文件,但其他人失敗,想知道是否有人可以幫我找出原因。我有兩種方法可以打破兩個不同的文件。第一consts.mjava文件我嘗試編譯爲:空指針錯誤再次
// demo of true local and global variables
int glob0;
int glob1;
final int two = 2;
final int three = 3;
main() {
int loc1;
int loc2;
int loc3;
final int four = 4;
glob0 = three;
//print("glob0=", glob0, "\n");
loc1 = glob0*two+1;
glob1 = glob0*loc1;
loc2 = glob1+1;
loc3 = glob1*loc2/four;
print("glob0=", glob0, " (should be 3)\n");
print("glob1=", glob1, " (should be 21)\n");
print("loc1=", loc1, " (should be 7)\n");
print("loc2=", loc2, " (should be 22)\n");
print("loc3=", loc3, " (should be 115)\n");
}
當我試圖用我的編譯器類它打破這裏編譯此:
private void compileFactor() {
if (isIdent(theToken)) {
String ident = theToken;
theToken = t.token();
IdentInfo theInfo = symTable.lookup(ident);
boolean its_a_variable = theInfo.isVar(); ***//Breaks Here for consts.mjava Null Exception***
int theAddr;
boolean isGlobal = theInfo.getIsGlobal();
int constValue;
int theNumber = 0;
if (its_a_variable) { // pld12: CHANGE THIS!!
theAddr = theInfo.getAddr();
isGlobal = theInfo.getIsGlobal();
if (theAddr == -1) t.error("undeclared identifier used in expr: "+ident);
if (isGlobal) cs.emit(Machine.LOAD, theAddr);
else cs.emit(Machine.LOADF, theAddr);
} else {
constValue = theInfo.getValue();
if (constValue == 0)
t.error("undeclared identifier used in expr: "+ident);
else {
cs.emitLOADINT(theNumber);
}
}
} else if (isNumber(theToken)) {
int theNumber = new Integer(theToken).intValue();
cs.emitLOADINT(theNumber);
theToken = t.token();
} else if (equals(theToken, "(")) {
accept("(");
compileExpr();
accept(")");
}
}
下locs.mjava文件我嘗試運行這種方法突破:
private void compileIdentStmt() {
String ident = theToken;
boolean isGlobal = true;
int location = 0;
int entryPoint = 0;
IdentInfo varInfo = null;
if (!isIdent(ident)) t.error("expected identifier, got " + theToken);
theToken = t.token();
if (equals(theToken, "=")) {
accept("=");
varInfo = symTable.lookup(ident);
if (varInfo.isVar() == true) { ***//Breaks Here on locs.mjava: Null Exception***
location = varInfo.getAddr();
isGlobal = varInfo.getIsGlobal();
}
/*
if (varInfo==null) {
location = GHack(ident);
isGlobal = true;
}
if (location == -1) {
location = LHack(ident);
isGlobal = false;
}
/* */
compileExpr();
if (isGlobal) cs.emit(Machine.STOR, location);
else cs.emit(Machine.STORF, location);
accept(";");
} else if (equals(theToken, "(")) {
varInfo = symTable.lookup(ident);
if (varInfo.isProc() == true) {
entryPoint = varInfo.getEntryPoint();
dprint("call to function " + ident + "; generating JSR to location " + entryPoint);
accept("(");
}
/*
if (!equals(theToken, ")")) {
compileExpr();
while (equals(theToken, ",")) {
accept(",");
compileExpr();
}
}
/* */
accept(")");
accept(";");
cs.emit(Machine.JSR, entryPoint);
} else t.error("expected \"=\" or \"(\", got " + theToken);
}
我甚至會從我的symTable()提供我的查找方法來幫助:
public IdentInfo lookup(String ident) {
IdentInfo ii;
if (HMLocal != null) {
ii = HMLocal.get(ident);
if (ii != null) {
return ii;
}
ii = HMGlobal.get(ident);
if (ii != null) {
return ii;
}
}
return null;
}
它被稱爲NullPointerException。閱讀錯誤和異常的區別 – Bozho 2009-12-10 15:44:15
有關mjava文件的特別之處是什麼? – 2009-12-10 17:29:36