目标:开发汇编编译器,将Hack汇编语言编写成的程序翻译成Hach硬件平台能够理解的二进制代码。
分析:本章的本质就是文本处理,将给定的.asm文本根据给定的规则映射为.hack二进制文件。
我们先分析.asm文件,一行可以是一下几种情况:
1)指令:又分为A-指令,C-指令。
2)常数和符号:常数还好解决,用户自定义的符号,还得为其分配内存。
3)注释:以"//"开头的被认为是注释,忽略。
4)空行:忽略。
书中为了降低难度先要求实现一个无符号版的,这也是一种很好的思维方法,将复杂的问题,转换为简单的已知的问题。
书中也给出了模块的API,既然是文本处理,语言自然就是python啦。
实现:
Paser模块:
<span style="font-size:12px;">def hasMoreCommand(line):
if not line:
return 0
return 1
def advance(fl): #return next line
line = fl.readline()
return line
def clear(line):
index = line.find('//')
if index > 0: #remove the gloss
line = line[0:index]
return line.strip('\n ') #remove the blank then return
def commandType(line):
if line.find('(') > -1:
return 'L_COMMAND'
elif line.find('@') > -1:
return 'A_COMMAND'
else:
return 'C_COMMAND'
def symbol(line):
line = line.strip(' ()@\n')
return line
def dest(line):
if line.find(";") > 0: #deal with the jump command
return 'null'
index = line.find('=')
return line[0:index].strip()
def comp(line):
index = line.find(';')
if index > 0:
return line[0:index].strip()
idx = line.find('