49 lines
1.4 KiB
Python
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)
|