目标:构建vm翻译器的第一部分,本质也是文本翻译,将vm程序翻译成.asm文件。
分析:首先熟悉vm程序的指令,本章涉及算数逻辑指令和push,pop指令,需要将其映射为汇编指令,汇编指令则直接操作D,A寄存器和内存。关键是明确这种映射关系。
Vmtranslator.py:
<span style="font-size:12px;">import sys,os
import Parser
import CodeWriter
filename=sys.argv[1]
rfile = open(filename,'r')
wfile = CodeWriter.setFileName(filename)
wfile.write('@256\nD=A\n@SP\nM=D\n')
line=Parser.advance(rfile)
flag=Parser.hasMoreCommands(line)
while flag:
while line == '\n' or line.startswith('//'):
line=rfile.readline()
ctype=Parser.commandType(line)
if ctype == 'C_ARITHMATIC':
attribute1=Parser.arg1(line).strip()
CodeWriter.writeArithmatic(wfile,attribute1)
elif ctype in ('C_PUSH','C_POP'):
attribute1=Parser.arg1(line).strip()
attribute2=Parser.arg2(line).strip()
CodeWriter.writePushPop(wfile,ctype,attribute1,attribute2)
line=Parser.advance(rfile)
flag=Parser.hasMoreCommands(line)
rfile.close()
CodeWriter.Close(wfile)</span>
Parser.py:
<span style="font-size:12px;">Arith=('add','sub','neg','eq','gt','lt','and','or','not')
def hasMoreCommands(line):
if not line:
return 0
else:
return 1
def advance(rfile):
line=rfile.readline()