Example #1
0
class Translator(object):
    def __init__(self, asm_file):
        self.stream_manager = StreamManager(asm_file)

    def get_machine_code(self):

        symbol_table = SymbolTableFactory.get_symbol_table(self.stream_manager)

        result = ""
        self.stream_manager.reset()
        command = self.stream_manager.advance()
        while True:
            if Parser.command_type(command) == Parser.A_TYPE:
                addr = Parser.addr(command)
                if addr.isdigit():
                    code = Encoder.encode_addr(addr)
                elif addr in symbol_table.keys():
                    addr = symbol_table[addr]
                    code = Encoder.encode_addr(addr)
                else:
                    raise InvalidCommendType()
                result += (code + '\n')

            elif Parser.command_type(command) == Parser.C_TYPE:
                dest = Parser.dest(command)
                comp = Parser.comp(command)
                jump = Parser.jump(command)

                code_dest = Encoder.encode_dest(dest)
                code_comp = Encoder.encode_comp(comp)
                code_jump = Encoder.encode_jump(jump)
                c_prefix = "111"
                code = c_prefix + code_comp + code_dest + code_jump
                result += (code + '\n')

            elif Parser.command_type(command) in [
                    Parser.L_TYPE, Parser.IGNORE
            ]:
                pass
            else:
                raise InvalidCommendType()

            if not self.stream_manager.has_more_commands():
                break
            command = self.stream_manager.advance()
        return result