def parse_line(ln, file_name): """ Parse line and check if the line is arithmetic/logical operation or memory access operation and send respectively to the appropriate function to translate :param ln: line from vm file to translate :param file_name: the name of the vm file :return: line translate to asm commands """ line = check_comment_in_line(ln) parsed = line.split() command = parsed[0] if command == C_POP or command == C_PUSH: # memory access operation return memory_access_command(parsed, file_name) elif command == "label": return Translator.write_label(parsed[1]) elif command == "goto": return Translator.write_goto(parsed[1]) elif command == "if-goto": return Translator.write_if(parsed[1]) elif command == "function": return Translator.write_function(parsed[1], parsed[2]) elif command == "call": return Translator.write_call(parsed[1], parsed[2]) elif command == "return": return Translator.write_return() else: # arithmetic/logical operation return Translator.arithmetic_logical_command(command)