From 159ee81375625945ae196a964e132a06eb8685b7 Mon Sep 17 00:00:00 2001 From: Antoine Viallon Date: Tue, 23 May 2023 00:47:09 +0200 Subject: [PATCH] semantic: refactor types and variable handling --- compiler/semantic.py | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/compiler/semantic.py b/compiler/semantic.py index 0c6c337..710f954 100644 --- a/compiler/semantic.py +++ b/compiler/semantic.py @@ -52,6 +52,7 @@ class Context: def __init__(self, name: str | None = None, parent: Context | None = None): self.parent = parent self.variables: dict[str, Variable] = {} + self.types: dict[str, Type] = {} self.child_contexts: dict[str, Context] = {} self.name = str(Context._id_sequence) if name is not None: @@ -63,18 +64,20 @@ class Context: return str(self.name) return f"{self.parent.fully_qualified_name()}::{self.name}" - def get_variable(self, name: str) -> Variable | None: - if name in self.variables: - return self.variables[name] + @typecheck + def _resolve_symbol(self, attribute_name: str, name: str) -> SymbolABC | None: + attribute = getattr(self, attribute_name) + if name in attribute: + return attribute[name] elif self.parent is 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 None - def add_context(self, context: Context) -> None: - self.child_contexts[context.name] = context + def get_variable(self, name: str) -> Variable | None: + return self._resolve_symbol("variables", name) def set_variable(self, name: str, value: nodes.Value) -> Variable: variable: Variable @@ -88,6 +91,26 @@ class Context: 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): return f"{self.__class__.__name__}(id={repr(self.name)})"