symbol_table.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import types_mv
  2. class Symbol(object):
  3. def __init__(self, name, type=types_mv.Element(), is_global=False, node=None, params=None):
  4. self.name = name
  5. self.type = type
  6. self.is_global = is_global
  7. self.node = node
  8. self.params = params
  9. def is_func(self):
  10. return self.params is not None
  11. def signature(self):
  12. if self.is_func():
  13. params = ", ".join([str(t) for t in self.params])
  14. return "{} function {}({})".format(str(self.type),
  15. self.name, params)
  16. else:
  17. return self.name
  18. class SymbolTable(object):
  19. def __init__(self):
  20. self.stacks = []
  21. def open_scope(self):
  22. self.stacks.append({})
  23. def close_scope(self):
  24. self.stacks.pop()
  25. def add(self, symbol):
  26. if symbol.name in self.stacks[-1]:
  27. raise Exception("Redefinition of symbol " + str(symbol))
  28. else:
  29. self.stacks[-1][symbol.name] = symbol
  30. def get(self, name):
  31. for frame in reversed(self.stacks):
  32. try:
  33. return frame[name]
  34. except KeyError:
  35. # Not in this scope, so keep going
  36. pass
  37. raise KeyError("Undefined symbol: " + name)