symbol_table.py 1.3 KB

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