nand2tetris/compiler/symboltable.py

49 lines
1.4 KiB
Python

from constants import SymbolType
class SymbolTable:
def __init__(self):
self.subroutineTable = {}
self.classTable = {}
self.subroutineIndex = 0
self.classIndex = 0
def startSubroutine(self):
self.subroutineTable = {}
def define(self, name, var_type, kind):
if (kind in [SymbolType.STATIC, SymbolType.FIELD]):
self.classTable[name] = (var_type, kind, self.classIndex)
self.classIndex += 1
elif (kind in [SymbolType.ARG, SymbolType.VAR]):
self.subroutineTable[name] = (var_type, kind, self.subroutineIndex)
self.subroutineIndex += 1
else:
raise Exception("Invalid SymbolType")
def varCount(self, kind):
t = None
if (kind in [SymbolType.STATIC, SymbolType.FIELD]):
t = self.classTable
elif (kind in [SymbolType.ARG, SymbolType.VAR]):
t = self.subroutineTable
else:
raise Exception("Invalid SymbolType")
return len([i for i in t.values() if i[1] == kind])
def _lookup(self, name, index):
if name in self.classTable:
return self.classTable[name][index]
elif name in self.subroutineTable:
return self.subroutineTable[name][index]
else:
raise Exception("Invalid variable name")
def TypeOf(self, name):
return self._lookup(name, 0)
def KindOf(self, name):
return self._lookup(name, 1)
def IndexOf(self, name):
return self._lookup(name, 2)