-
Notifications
You must be signed in to change notification settings - Fork 0
/
symbol_table.py
36 lines (26 loc) · 988 Bytes
/
symbol_table.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from __future__ import annotations
from typing import Optional, Union, Dict, TYPE_CHECKING, List
if TYPE_CHECKING:
from lang_types.lang_type import LangType
Value = LangType
class SymbolTable:
def __init__(self, parent: Optional[SymbolTable] = None) -> None:
self.symbols: Dict[str, Value] = {}
self.parent = parent
def get(self, name: str) -> Optional[Value]:
if name in self.symbols:
return self.symbols[name]
if self.parent:
return self.parent.get(name)
return None
def set(self, name: str, value: Value) -> None:
if name != "_":
self.symbols[name] = value
def remove(self, name: str) -> None:
del self.symbols[name]
def __repr__(self) -> str:
s = ""
for key, value in self.symbols.items():
s += str(key) + ": " + str(value) + "\n"
parent = "Parent\n" + str(self.parent)
return s + parent.replace("\n", "\n\t")