Files
VM-To-Assembly/VM-Compiler
T

71 lines
2.5 KiB
Plaintext

from os import listdir
class VirtualMachineCompiler:
def __init__(self,file_path):
self.file_path=file_path
self.files=[]
self.files_content=[]
self.is_folder=True
if ".vm" in file_path:
self.is_folder=False
self.files.append(file_path)
self.assembly_commands={
None:"",
"add":"@SP\nA=M\nD=M\n@SP\nM=M-1\nA=M\nM=D+M\n",
"sub":"@SP\nA=M\nD=M\n@SP\nM=M-1\nA=M\nM=M-D\n",
"neg":"@SP\nA=M\nM=-M\n",
"eq":"@SP\nA=M\nD=M\n@SP\nAM=M-1\nD=M-D\nM=-1\n@LABEL{number}\nD;JEQ\n@SP\nA=M\nM=0\n(LABLE{number})\n",
"gt":"@SP\nA=M\nD=M\n@SP\nAM=M-1\nD=M-D\nM=-1\n@LABEL{number}\nD;JGT\n@SP\nA=M\nM=0\n(LABLE{number})\n",
"lt":"@SP\nA=M\nD=M\n@SP\nAM=M-1\nD=M-D\nM=-1\n@LABEL{number}\nD;JLT\n@SP\nA=M\nM=0\n(LABLE{number})\n",
"and":"@SP\nA=M\nD=M\n@SP\nM=M-1\nA=M\nM=D&M\n",
"or":"@SP\nA=M\nD=M\n@SP\nM=M-1\nA=M\nM=D|M\n",
"not":"@SP\nA=M\nM=!M\n",
"push":"",
"pop":"",
"label":"",
"goto":"",
"if-goto":"",
"function":"",
"call":"",
"return":""
}
self.arguments={
None:"",
"argument":"ARG",
"local":"LCL",
"static":"",
"constant":"",
"this":"",
"that":"",
"pointer":"",
"temp":""
}
self.label_number=0
def folder_search(self):
for item in listdir(self.file_path):
if ".vm" in item:
self.files.append(self.file_path+"\\"+item)
def parser_module(self):
if self.is_folder:
self.folder_search()
for file in self.files:
file_content=open(file)
for line in file_content:
command=[None,None,None]
line=line[:line.find("//")]
line = line.strip()
if line =="":
continue
line_array=line.split()
for index in range(len(line_array)):
command[index]=line_array[index]
self.files_content.append(command)
file_content.close()
def code_writer_module(self):
file_path=self.file_path
if not self.is_folder:
file_path=file_path[:file_path.find(".")]
assembly_file=open(file_path,"w")
for line in self.files_content:
continue