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

