Skip to content

symbol_table

The SymbolTable class offered here allows the definition of scopes, so the variable or function would be available in specifics scopes.

Classes:

Scope

Scope(scope_node_class: type[ScopeNodeBase] = ScopeNode)

Methods:

Source code in packages/astx/src/astx/symbol_table.py
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
def __init__(
    self,
    scope_node_class: type[ScopeNodeBase] = ScopeNode,
) -> None:
    """
    title: Initialize the scope.
    parameters:
      scope_node_class:
        type: type[ScopeNodeBase]
    """
    self.nodes: dict[int, ScopeNodeBase] = {}
    self.current = None
    self.previous = None
    self.scope_node_class = scope_node_class

    self.add("root")

    self.scope_node_class.default_parent = self.current

add

add(
    name: str,
    parent: Optional[ScopeNodeBase] = None,
    change_current: bool = True,
) -> ScopeNodeBase
Source code in packages/astx/src/astx/symbol_table.py
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
def add(
    self,
    name: str,
    parent: Optional[ScopeNodeBase] = None,
    change_current: bool = True,
) -> ScopeNodeBase:
    """
    title: Add a new node in the scope.
    parameters:
      name:
        type: str
      parent:
        type: Optional[ScopeNodeBase]
      change_current:
        type: bool
    returns:
      type: ScopeNodeBase
    """
    node = self.scope_node_class(name, parent)

    # The use of id(node) as keys in the nodes dictionary is generally
    # fine, but be aware that this approach may lead to potential issues
    # if the id() of a node is reused after its destruction. It's #
    # unlikely to happen in the current code, but it's something to be
    # aware of.
    self.nodes[id(node)] = node

    if len(self.nodes) == 1 or change_current:
        self.previous = self.current
        self.current = self.nodes[id(node)]

    return node

destroy

destroy(node: ScopeNodeBase) -> None
Source code in packages/astx/src/astx/symbol_table.py
169
170
171
172
173
174
175
176
177
178
def destroy(self, node: ScopeNodeBase) -> None:
    """
    title: Destroy the current scope.
    parameters:
      node:
        type: ScopeNodeBase
    """
    del self.nodes[id(node)]
    self.current = self.previous
    self.previous = None

get_first

get_first() -> ScopeNodeBase
Source code in packages/astx/src/astx/symbol_table.py
151
152
153
154
155
156
157
158
def get_first(self) -> ScopeNodeBase:
    """
    title: Get the first node in the scope.
    returns:
      type: ScopeNodeBase
    """
    node_id = next(iter(self.nodes.keys()))
    return self.nodes[node_id]

get_last

get_last() -> ScopeNodeBase
Source code in packages/astx/src/astx/symbol_table.py
160
161
162
163
164
165
166
167
def get_last(self) -> ScopeNodeBase:
    """
    title: Get the latest node in the scope.
    returns:
      type: ScopeNodeBase
    """
    node_id = list(self.nodes.keys())[-1]
    return self.nodes[node_id]

set_default_parent

set_default_parent(node: ScopeNodeBase) -> None
Source code in packages/astx/src/astx/symbol_table.py
180
181
182
183
184
185
186
187
def set_default_parent(self, node: ScopeNodeBase) -> None:
    """
    title: Set default parent for the current scope.
    parameters:
      node:
        type: ScopeNodeBase
    """
    self.scope_node_class.default_parent = node

ScopeNode

ScopeNode(
    name: str, parent: Optional[ScopeNodeBase] = None
)

Bases: ScopeNodeBase

Source code in packages/astx/src/astx/symbol_table.py
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def __init__(
    self, name: str, parent: Optional[ScopeNodeBase] = None
) -> None:
    """
    title: Initialize ScopeNodeBase.
    parameters:
      name:
        type: str
      parent:
        type: Optional[ScopeNodeBase]
    """
    self.parent: Optional[ScopeNodeBase] = (
        parent or ScopeNodeBase.default_parent
    )
    self.name: str = name
    self.named_expr: dict[str, NamedExpr] = {}

ScopeNodeBase

ScopeNodeBase(
    name: str, parent: Optional[ScopeNodeBase] = None
)
Source code in packages/astx/src/astx/symbol_table.py
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def __init__(
    self, name: str, parent: Optional[ScopeNodeBase] = None
) -> None:
    """
    title: Initialize ScopeNodeBase.
    parameters:
      name:
        type: str
      parent:
        type: Optional[ScopeNodeBase]
    """
    self.parent: Optional[ScopeNodeBase] = (
        parent or ScopeNodeBase.default_parent
    )
    self.name: str = name
    self.named_expr: dict[str, NamedExpr] = {}

SymbolTable

SymbolTable()

Methods:

Source code in packages/astx/src/astx/symbol_table.py
202
203
def __init__(self) -> None:
    self.scopes = Scope()

define

define(expr: NamedExpr) -> None
Source code in packages/astx/src/astx/symbol_table.py
205
206
207
208
209
210
211
212
213
214
def define(self, expr: NamedExpr) -> None:
    """
    title: Define a new named expression inside the scoped stack.
    parameters:
      expr:
        type: NamedExpr
    """
    if not self.scopes.current:
        raise Exception("SymbolTable: No scope active.")
    self.scopes.current.named_expr[expr.name] = expr

lookup

lookup(name: str) -> NamedExpr
Source code in packages/astx/src/astx/symbol_table.py
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
def lookup(self, name: str) -> NamedExpr:
    """
    title: Get a named expression from the scope stack.
    parameters:
      name:
        type: str
    returns:
      type: NamedExpr
    """
    scope = self.scopes.current
    while scope is not None:
        if name in scope.named_expr:
            return scope.named_expr[name]
        scope = scope.parent
    raise NameError(f"Name '{name}' is not defined")

update

update(expr: NamedExpr) -> None

It is useful mainly for updating the comment of the expression. parameters: expr: type: NamedExpr

Source code in packages/astx/src/astx/symbol_table.py
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
def update(self, expr: NamedExpr) -> None:
    """
    title: Update the expression on the SymbolTable.
    summary: |-

      It is useful mainly for updating the comment of the expression.
    parameters:
      expr:
        type: NamedExpr
    """
    if not self.scopes.current:
        raise Exception("SymbolTable: No scope active.")
    if expr.name not in self.scopes.current.named_expr:
        raise Exception("This name doesn't exist in the SymbolTable.")
    self.scopes.current.named_expr[expr.name] = expr