2011-03-08 16 views
0

基本上,它是一个双程汇编程序,我正在将入口点实现为给定的程序集文件。命令格式如下:作为汇编程序(用于编写语言)的Java程序:在循环中不会退出

Prog  .ORIG 
     .ENT some,entry,point 
some  LD  R0,entry 
entry LD  R1,point 
point .FILL #42 
     .END some 

相关部分是.ENT行。这就是汇编程序越来越多的问题。

第一遍处理.ENTs,但它不适用于任何超过两个参数(即多个逗号)。尽管如此,它确实可以用于两个操作数。具体.ENT部分的代码如下:

String comma = ","; 
String entry = ""; 
String[] tempEntryArray = new String[2]; 
int indexOfComma = read.indexOf(comma); 
int startingIndex = 17; 
int numOperands = 1; 
while (indexOfComma != -1) { 
    if ((indexOfComma-startingIndex) == 0) { 
     return "An operand must precede the comma."; 
    } 
    if (numOperands > 4) { 
     return "The .ENT psuedo-op on line " + lineCounter 
       + " has more than 4 operands."; 
    } 
    entry = overSubstring(read, startingIndex, indexOfComma); 
    if (entry.contains(" ")) { 
     return "The operand \"" + entry + "\" on line " 
       + lineCounter + " has a space in it."; 
    } 
    if (entry.length() > 6) { 
     return "The operand \"" + entry + "\" on line " 
       + lineCounter + " is longer than 6 characters."; 
    } 
    machineTables.externalSymbolTable.put(entry, tempEntryArray); 
    entry = read.substring(indexOfComma + 1); 
    startingIndex = indexOfComma + 1; 
    indexOfComma = entry.indexOf(comma); 
    if (indexOfComma != -1) { 
     indexOfComma += (startingIndex - 1); 
    } 
    numOperands++; 
} 
entry = overSubstring(read, startingIndex, read.length()); 
if (entry.contains(" ")) { 
    return "The operand \"" + entry + "\" on line " 
      + lineCounter + " has a space in it."; 
} 
if (entry.length() > 6) { 
    return "The operand \"" + entry + "\" on line " 
      + lineCounter + " is longer than 6 characters."; 
} 
machineTables.externalSymbolTable.put(entry, tempEntryArray); 

read是一个包含输入文件一行的字符串。 overSubstring是一种类似于substring的方法,但是如果它读取一个空字符串,它将返回一个空白字符。

对于大块代码我很抱歉,我知道错误信息可以做得更好,但是现在我关心的是这个特殊的代码挂在汇编器上,只要有两个以上的操作数(多于一个逗号)。

如果有人能帮我解决这个问题,我将非常感激。

谢谢。

+1

您是否尝试过使用调试器? – 2011-03-08 03:22:47

回答

1

我认为你无限期地阅读相同的indexOfComma值。而不是startingIndexsubstring()业务,只需使用String#indexOf(String, int)而不是String#indexOf(String)即可正确跳过已找到的上述索引。

始终获得indexOfComma类似这样的:

int indexOfComma = -1; 
int numOperands = 1; 
while ((indexOfComma = read.indexOf(comma, indexOfComma+1)) != -1) { 
    // snip... 
    machineTables.externalSymbolTable.put(entry, tempEntryArray); 
    numOperands++; 
} 
+0

神圣的**,非常感谢老兄! 我所要做的只是用indexOfComma = read.indexOf(逗号,startingIndex)替换indexOfComma = entry.indexOf(逗号) – RBurgundy 2011-03-08 03:33:06

+0

@user:是否解决了这个问题? – 2011-03-08 03:37:46

+0

是的,它现在有效。 – RBurgundy 2011-03-08 05:03:55