2009-12-10 81 views
1

所以我有這個編譯器類編譯一些.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; 
    } 
+0

它被稱爲NullPointerException。閱讀錯誤和異常的區別 – Bozho 2009-12-10 15:44:15

+1

有關mjava文件的特別之處是什麼? – 2009-12-10 17:29:36

回答

2

如果您得到NullPointerExceptions,那是因爲theInfovarInfo在您的示例中爲null。

1

IdentInfo theInfo = symTable.lookup(ident); 

,你應該檢查是否theInfo是試圖與它的工作前空,因爲您的查找方法,明確指出它可以返回空值之後。