semantic: refactor types and variable handling
This commit is contained in:
parent
98f0465238
commit
159ee81375
1 changed files with 29 additions and 6 deletions
|
|
@ -52,6 +52,7 @@ class Context:
|
||||||
def __init__(self, name: str | None = None, parent: Context | None = None):
|
def __init__(self, name: str | None = None, parent: Context | None = None):
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.variables: dict[str, Variable] = {}
|
self.variables: dict[str, Variable] = {}
|
||||||
|
self.types: dict[str, Type] = {}
|
||||||
self.child_contexts: dict[str, Context] = {}
|
self.child_contexts: dict[str, Context] = {}
|
||||||
self.name = str(Context._id_sequence)
|
self.name = str(Context._id_sequence)
|
||||||
if name is not None:
|
if name is not None:
|
||||||
|
|
@ -63,18 +64,20 @@ class Context:
|
||||||
return str(self.name)
|
return str(self.name)
|
||||||
return f"{self.parent.fully_qualified_name()}::{self.name}"
|
return f"{self.parent.fully_qualified_name()}::{self.name}"
|
||||||
|
|
||||||
def get_variable(self, name: str) -> Variable | None:
|
@typecheck
|
||||||
if name in self.variables:
|
def _resolve_symbol(self, attribute_name: str, name: str) -> SymbolABC | None:
|
||||||
return self.variables[name]
|
attribute = getattr(self, attribute_name)
|
||||||
|
if name in attribute:
|
||||||
|
return attribute[name]
|
||||||
elif self.parent is None:
|
elif self.parent is None:
|
||||||
return None
|
return None
|
||||||
elif (var := self.parent.get_variable(name)) is not None:
|
elif (var := self.parent._resolve_symbol(attribute_name, name)) is not None:
|
||||||
return var
|
return var
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def add_context(self, context: Context) -> None:
|
def get_variable(self, name: str) -> Variable | None:
|
||||||
self.child_contexts[context.name] = context
|
return self._resolve_symbol("variables", name)
|
||||||
|
|
||||||
def set_variable(self, name: str, value: nodes.Value) -> Variable:
|
def set_variable(self, name: str, value: nodes.Value) -> Variable:
|
||||||
variable: Variable
|
variable: Variable
|
||||||
|
|
@ -88,6 +91,26 @@ class Context:
|
||||||
|
|
||||||
return variable
|
return variable
|
||||||
|
|
||||||
|
@typecheck
|
||||||
|
def set_type(self, name: str, value: nodes.Value) -> Type | None:
|
||||||
|
typedef: Type
|
||||||
|
if name in self.types:
|
||||||
|
typedef = self.types[name]
|
||||||
|
typedef.definitions += [value]
|
||||||
|
else:
|
||||||
|
typedef = Type(self, name, value)
|
||||||
|
|
||||||
|
self.types[name] = typedef
|
||||||
|
|
||||||
|
return typedef
|
||||||
|
|
||||||
|
@typecheck
|
||||||
|
def get_type(self, name: str) -> Type | None:
|
||||||
|
return self._resolve_symbol("types", name)
|
||||||
|
|
||||||
|
def add_context(self, context: Context) -> None:
|
||||||
|
self.child_contexts[context.name] = context
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.__class__.__name__}(id={repr(self.name)})"
|
return f"{self.__class__.__name__}(id={repr(self.name)})"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue