symbol_table.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import hutn_compiler.types_mv as 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. @staticmethod
  10. def is_func(symb):
  11. return symb['params'] is not None
  12. @staticmethod
  13. def signature(symb):
  14. if Symbol.is_func(symb):
  15. params = ", ".join([str(t) for t in symb['params']])
  16. return "{} function {}({})".format(str(symb['type']),
  17. symb['name'], params)
  18. else:
  19. return symb['name']
  20. class SymbolTable(object):
  21. def __init__(self):
  22. self.stacks = []
  23. def open_scope(self):
  24. self.stacks.append({})
  25. def close_scope(self):
  26. self.stacks.pop()
  27. def add(self, symbol):
  28. if symbol['name'] in self.stacks[-1]:
  29. raise Exception("Redefinition of symbol " + str(symbol))
  30. else:
  31. self.stacks[-1][symbol['name']] = symbol
  32. def get(self, name):
  33. for frame in reversed(self.stacks):
  34. try:
  35. return frame[name]
  36. except KeyError:
  37. # Not in this scope, so keep going
  38. pass
  39. raise KeyError("Undefined symbol: " + name)