From 8c26293416332c33a30d7c838deb56d2229a6f06 Mon Sep 17 00:00:00 2001 From: Antoine Viallon Date: Wed, 24 May 2023 00:22:22 +0200 Subject: [PATCH] semantic+nodes: record variable definitions --- compiler/nodes.py | 5 +++-- compiler/semantic.py | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/compiler/nodes.py b/compiler/nodes.py index c466edf..50c1f8b 100644 --- a/compiler/nodes.py +++ b/compiler/nodes.py @@ -416,7 +416,7 @@ class Definition(Assignment): def __init__(self, identifier: Identifier, type_identifier: Identifier, value: Value | None, *pseudo_nodes: PseudoNode): - super().__init__(identifier, value) + super(Definition, self).__init__(identifier, value) self.type_identifier = type_identifier self.pseudo_nodes = list(pseudo_nodes) @@ -440,7 +440,8 @@ class Definition(Assignment): def semantic_analysis(self, context: semantic.Context): super(Assignment, self).semantic_analysis(context) name = self.identifier.value - variable = context.define_variable(name, type_identifier=self.type_identifier, value=self.value) + variable = context.define_variable(name, definition=self, type_identifier=self.type_identifier, + value=self.value) self.variable = variable logger.debug(f"Added variable {variable} to context {context.fully_qualified_name()}") diff --git a/compiler/semantic.py b/compiler/semantic.py index 702c19f..a65a203 100644 --- a/compiler/semantic.py +++ b/compiler/semantic.py @@ -12,13 +12,17 @@ logger = Logger(__name__) class SymbolABC(abc.ABC): - def __init__(self, context: Context, name: str, value: nodes.Value | None | Literal["builtin"] = None): + def __init__(self, context: Context, name: str, + definition: nodes.Node | None = None, + value: nodes.Node | None | Literal["builtin"] = None): self.context = context self.name = name self.writes: list[nodes.Node] = [] if isinstance(value, nodes.Node): self.writes += [value] + self.definition = definition + self.reads: list[nodes.Node] = [] self._repr_guard: bool = False @@ -39,8 +43,10 @@ class SymbolABC(abc.ABC): class Type(SymbolABC): - def __init__(self, context: Context, name: str, value: nodes.Value | None | Literal["builtin"] = None): - super().__init__(context, name, value=value) + def __init__(self, context: Context, name: str, + definition: nodes.Node | None = None, + value: nodes.Value | None | Literal["builtin"] = None): + super().__init__(context, name, definition=definition, value=value) class Function(Type): @@ -50,9 +56,10 @@ class Function(Type): class Variable(SymbolABC): @typecheck def __init__(self, context: Context, name: str, + definition: nodes.Definition | None = None, value: nodes.Value | None = None, typedef: Type | None = None): - super().__init__(context, name, value=value) + super().__init__(context, name, definition=definition, value=value) self.type = typedef if typedef is not None else context.get_type("__unknown") def __str__(self): @@ -100,6 +107,7 @@ class Context: return self._get_symbol("variables", name, reader) def define_variable(self, name: str, + definition: nodes.Definition, type_identifier: nodes.Identifier, value: nodes.Value) -> Variable: if name in self.variables: raise SemanticAnalysisError(value.location()) @@ -109,7 +117,7 @@ class Context: raise SemanticAnalysisError(location=type_identifier.location(), message=f"Unknown type '{type_identifier.value}'") - variable = Variable(self, name, value=value, typedef=typedef) + variable = Variable(self, name, definition=definition, value=value, typedef=typedef) self.variables[name] = variable