我已经创建了应该将机器语言转换为汇编语言的代码,但是当我尝试从命令提示符运行它时,我一直收到错误。我收到的错误是:
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 :(得分: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()
答案 1 :(得分: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
),但仍然不在列表访问范围内。