アセンブラを作る / シンボルテーブルを作る

Chapter 6
これもテキストの手順どおりに作る。ここでは辞書を使った。

class Symbol_Table:
    def __init__(self, num_registers=16):
        self.symbols = {"SP":0, "LCL":1, "ARG":2, "THIS":3, "THAT":4}
        self.ram_last_address = num_registers - 1

        # 疑似汎用レジスタとして使うramのアドレスをシンボルテーブルに追加する。
        for i in range(num_registers):
            self.symbols["R" + str(i)] = i

    def add_entry(self, symbol, address):
        if not self.contains(symbol):
            self.symbols[symbol] = address
        else:
            print("symbol already exists")

    def contains(self, symbol):
        return symbol in self.symbols
    
    def get_address(self, symbol):
        return self.symbols[symbol]


##################################################
if __name__ == "__main__":
    NUM_REGISTERS = 16
    
    s = Symbol_Table(NUM_REGISTERS)
    print("初期化直後:", s.symbols)

    s.add_entry("LOOP",10)

    s.ram_last_address += 1
    s.add_entry("sum", s.ram_last_address)

    s.ram_last_address += 1
    s.add_entry("i", s.ram_last_address)

    s.add_entry("LOOP2",20)
    print("エントリ追加後: ", s.symbols)

実行結果: