class VMWriter: def __init__(self, vm_path): self.my_vm = open(vm_path, "w+") self.label_index = 0 def write_push(self, segment, index): self.my_vm.write(f'push {segment} {index}\n') print(f'push {segment} {index}') def write_lable(self, label): self.my_vm.write(f'label L{label}\n') print(f'label L{label}') def write_arithmetic(self, command): if command == '+': self.my_vm.write('add\n') print('add') elif command == '-': self.my_vm.write('sub\n') print('sub') elif command == 'neg': self.my_vm.write('neg\n') print('neg') elif command == '=': self.my_vm.write('eq\n') print('eq') elif command == '>': self.my_vm.write('gt\n') print('gt') elif command == '<': self.my_vm.write('lt\n') print('lt') elif command == '&': self.my_vm.write('and\n') print('and') elif command == '|': self.my_vm.write('or\n') print('or') elif command == '~': self.my_vm.write('not\n') print('not') elif command == '*': self.write_call('Math.multiply', 2) elif command == '/': self.write_call('Math.divide', 2) def write_pop(self, segment, index): print(f'pop {segment} {index}') self.my_vm.write(f'pop {segment} {index}\n') def write_goto(self, label): self.my_vm.write(f'goto L{label}\n') print(f'goto L{label}') def write_if(self, label): self.write_arithmetic('~') self.my_vm.write(f'if-goto L{label}\n') print(f'if-goto L{label}') def write_call(self, label, num_args): self.my_vm.write(f'call {label} {num_args}\n') print(f'call {label} {num_args}') def write_function(self, label, num_locals): self.my_vm.write(f'function {label} {num_locals}\n') print(f'function {label} {num_locals}') def write_return(self, func_type): if func_type == 'void': self.write_push('constant', '0') self.my_vm.write('return\n') print(f'return') def close_vm_file(self): self.my_vm.close()