From 6b3c0e8fe3576a33828a9acb09d24e01ff18d8ec Mon Sep 17 00:00:00 2001 From: Antoine Viallon Date: Tue, 23 May 2023 23:07:50 +0200 Subject: [PATCH] nodes: add PseudoNodes to statements, for better display and diagnostics --- compiler/nodes.py | 7 +++++-- compiler/parser.py | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/compiler/nodes.py b/compiler/nodes.py index b456534..eaf3d64 100644 --- a/compiler/nodes.py +++ b/compiler/nodes.py @@ -262,12 +262,15 @@ class Expression(Node): class Statement(Node): - def __init__(self, *nodes: Node): + def __init__(self, *nodes: Node, pseudo_nodes: list[PseudoNode] | None = None): super().__init__() self.nodes = list(nodes) + self.pseudo_nodes = [] + if pseudo_nodes is not None: + self.pseudo_nodes = pseudo_nodes def _values(self) -> list[Node | Any]: - return self.nodes + return self.nodes + self.pseudo_nodes def intermediate_representation(self) -> list[ir.IRItem]: result: list[ir.IRItem] = [] diff --git a/compiler/parser.py b/compiler/parser.py index 92ec563..48c3eda 100644 --- a/compiler/parser.py +++ b/compiler/parser.py @@ -170,10 +170,10 @@ class Parser: if lbrace := self.accept(Tokens.Brace_Left): block = self.block(name="anon") rbrace = self.expect(Tokens.Brace_Right) - return Statement(block, PseudoNode(lbrace), PseudoNode(rbrace)) + return Statement(block, pseudo_nodes=[PseudoNode(lbrace), PseudoNode(rbrace)]) elif expr := self.expression(mandatory): semicolon = PseudoNode(self.expect(Tokens.Semicolon)) - return Statement(expr, semicolon) + return Statement(expr, pseudo_nodes=[semicolon]) elif mandatory: raise UnexpectedTokenError(expr, wanted="expression")