semantic+nodes: record variable definitions
This commit is contained in:
parent
88526aa5e6
commit
8c26293416
2 changed files with 16 additions and 7 deletions
|
|
@ -416,7 +416,7 @@ class Definition(Assignment):
|
||||||
|
|
||||||
def __init__(self, identifier: Identifier, type_identifier: Identifier, value: Value | None,
|
def __init__(self, identifier: Identifier, type_identifier: Identifier, value: Value | None,
|
||||||
*pseudo_nodes: PseudoNode):
|
*pseudo_nodes: PseudoNode):
|
||||||
super().__init__(identifier, value)
|
super(Definition, self).__init__(identifier, value)
|
||||||
self.type_identifier = type_identifier
|
self.type_identifier = type_identifier
|
||||||
self.pseudo_nodes = list(pseudo_nodes)
|
self.pseudo_nodes = list(pseudo_nodes)
|
||||||
|
|
||||||
|
|
@ -440,7 +440,8 @@ class Definition(Assignment):
|
||||||
def semantic_analysis(self, context: semantic.Context):
|
def semantic_analysis(self, context: semantic.Context):
|
||||||
super(Assignment, self).semantic_analysis(context)
|
super(Assignment, self).semantic_analysis(context)
|
||||||
name = self.identifier.value
|
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
|
self.variable = variable
|
||||||
logger.debug(f"Added variable {variable} to context {context.fully_qualified_name()}")
|
logger.debug(f"Added variable {variable} to context {context.fully_qualified_name()}")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,13 +12,17 @@ logger = Logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SymbolABC(abc.ABC):
|
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.context = context
|
||||||
self.name = name
|
self.name = name
|
||||||
self.writes: list[nodes.Node] = []
|
self.writes: list[nodes.Node] = []
|
||||||
if isinstance(value, nodes.Node):
|
if isinstance(value, nodes.Node):
|
||||||
self.writes += [value]
|
self.writes += [value]
|
||||||
|
|
||||||
|
self.definition = definition
|
||||||
|
|
||||||
self.reads: list[nodes.Node] = []
|
self.reads: list[nodes.Node] = []
|
||||||
self._repr_guard: bool = False
|
self._repr_guard: bool = False
|
||||||
|
|
||||||
|
|
@ -39,8 +43,10 @@ class SymbolABC(abc.ABC):
|
||||||
|
|
||||||
|
|
||||||
class Type(SymbolABC):
|
class Type(SymbolABC):
|
||||||
def __init__(self, context: Context, name: str, value: nodes.Value | None | Literal["builtin"] = None):
|
def __init__(self, context: Context, name: str,
|
||||||
super().__init__(context, name, value=value)
|
definition: nodes.Node | None = None,
|
||||||
|
value: nodes.Value | None | Literal["builtin"] = None):
|
||||||
|
super().__init__(context, name, definition=definition, value=value)
|
||||||
|
|
||||||
|
|
||||||
class Function(Type):
|
class Function(Type):
|
||||||
|
|
@ -50,9 +56,10 @@ class Function(Type):
|
||||||
class Variable(SymbolABC):
|
class Variable(SymbolABC):
|
||||||
@typecheck
|
@typecheck
|
||||||
def __init__(self, context: Context, name: str,
|
def __init__(self, context: Context, name: str,
|
||||||
|
definition: nodes.Definition | None = None,
|
||||||
value: nodes.Value | None = None,
|
value: nodes.Value | None = None,
|
||||||
typedef: Type | 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")
|
self.type = typedef if typedef is not None else context.get_type("__unknown")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
@ -100,6 +107,7 @@ class Context:
|
||||||
return self._get_symbol("variables", name, reader)
|
return self._get_symbol("variables", name, reader)
|
||||||
|
|
||||||
def define_variable(self, name: str,
|
def define_variable(self, name: str,
|
||||||
|
definition: nodes.Definition,
|
||||||
type_identifier: nodes.Identifier, value: nodes.Value) -> Variable:
|
type_identifier: nodes.Identifier, value: nodes.Value) -> Variable:
|
||||||
if name in self.variables:
|
if name in self.variables:
|
||||||
raise SemanticAnalysisError(value.location())
|
raise SemanticAnalysisError(value.location())
|
||||||
|
|
@ -109,7 +117,7 @@ class Context:
|
||||||
raise SemanticAnalysisError(location=type_identifier.location(),
|
raise SemanticAnalysisError(location=type_identifier.location(),
|
||||||
message=f"Unknown type '{type_identifier.value}'")
|
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
|
self.variables[name] = variable
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue