2013-02-23 42 views
0

我已經創建了應該將機器語言轉換爲彙編語言的代碼,但是我一直收到錯誤我嘗試從命令提示符運行它。我收到的錯誤是:我得到一個Python的索引錯誤,說它超出範圍,但我不知道爲什麼

Traceback <most recent call last>: 
    File "Assembler.py", line 102, in <module> 
    parser.advance() 
    File "Assembler.py", line 15, in advance 
    self.command = self.asm_file[self.index] 
IndexError: list index out of range 

我不太確定它爲什麼超出範圍。所有我把進入命令提示符是:

python Assembler.py MyFile.asm 

有人可以看看我下面的代碼,並幫助我弄清楚它爲什麼給我這個?

class Parser: 
def __init__(self, filename): 
    self.asm_file = [line for line in open(filename)] 
    self.index = 0 

def hasMoreCommands(self): 
    return self.index < len(self.asm_file) 

def advance(self): 
    self.index += 1 

    if self.index == len(self.asm_file): 
     return 

    self.command = self.asm_file[self.index] 
    self.command = self.removeCommentsAndSpaces(self.command) 

    if not self.command: 
     self.advance() 

有一個在這些塊之間只是更多的代碼定義,並且在該錯誤消息中引用的線102是線以下的塊10。

if __name__ == '__main__': 
import sys 

if len(sys.argv) == 1: 
    print 'need filename' 
    sys.exit(-1) 

table = SymbolTable() 
parser = Parser(sys.argv[1]) 
parser.advance() 
line = 0 

while parser.hasMoreCommands(): 
    if parser.commandType() == 'L_COMMAND': 
     table.addEntry(parser.symbol(), line) 
    else: 
     line += 1 

    parser.advance() 

code = Code() 
parser = Parser(sys.argv[1]) 
parser.advance() 

var_stack = 16 

while parser.hasMoreCommands(): 
    cmd_type = parser.commandType() 

    if cmd_type == 'A_COMMAND': 
     number = 32768 

     try: 
      addr = int(parser.symbol()) 
     except: 
      if table.contains(parser.symbol()): 
       addr = table.getAddress(parser.symbol()) 
      else: 
       table.addEntry(parser.symbol(), var_stack) 
       addr = var_stack 
       var_stack += 1 

     bin_number = bin(number | addr)[3:] 
     assembly = '0' + bin_number 
     print assembly 
    elif cmd_type == 'C_COMMAND': 
     assembly = '111' 
     assembly += code.comp(parser.comp()) 
     assembly += code.dest(parser.dest()) 
     assembly += code.jump(parser.jump()) 
     print assembly 

    parser.advance() 
+0

有沒有可能'index'超過'asm_file'的長度而不匹配*完全*?如果是這樣,你會期望看到你得到的錯誤。嘗試更改'如果self.index == len(self.asm_file)'如果self.index> = len(self.asm_file)' – 2013-02-23 23:40:57

回答

0

您試圖在腳本末尾訪問一行,然後存在行。所以嘗試在函數結尾處移動索引增量。

def advance(self): 


if self.index == len(self.asm_file): 
    return 

self.command = self.asm_file[self.index] 
self.command = self.removeCommentsAndSpaces(self.command) 

self.index += 1 

if not self.command: 
    self.advance() 

爲什麼不重新使用代碼?方式二:

def advance(self): 
self.index += 1 

if not self.hasMoreCommands(): 
    return 

self.command = self.asm_file[self.index] 
self.command = self.removeCommentsAndSpaces(self.command) 



if not self.command: 
    self.advance() 
0
self.index += 1 

if self.index == len(self.asm_file): 
    return 

self.command = self.asm_file[self.index] 

當你增加和訪問列表之前,人們會認爲你正在做的罰款後立即檢查你的索引。然而,這裏可能存在的問題是,在增加索引值之前,您已經在列表的長度。所以在增加之後,索引比列表長度大一個。

您可以通過在訪問列表之前打印索引來輕鬆檢查。走安全路線,只是改變你的支票,但:

if self.index >= len(self.asm_file): 
    return 

事實上,在去年片段的第10行出現的問題,即在這裏:

parser = Parser(sys.argv[1]) 
parser.advance() 

既然你提前只有一次,文件很可能是空的,即列表的長度爲零。因此,當您前進一次時,您的索引爲1,這不等於長度(0),但仍然超出列表訪問範圍。

相關問題