nodes: add PseudoNodes to statements, for better display and diagnostics

This commit is contained in:
Antoine Viallon 2023-05-23 23:07:50 +02:00
parent 066470b120
commit 6b3c0e8fe3
Signed by: aviallon
GPG key ID: D126B13AB555E16F
2 changed files with 7 additions and 4 deletions

View file

@ -262,12 +262,15 @@ class Expression(Node):
class Statement(Node): class Statement(Node):
def __init__(self, *nodes: Node): def __init__(self, *nodes: Node, pseudo_nodes: list[PseudoNode] | None = None):
super().__init__() super().__init__()
self.nodes = list(nodes) self.nodes = list(nodes)
self.pseudo_nodes = []
if pseudo_nodes is not None:
self.pseudo_nodes = pseudo_nodes
def _values(self) -> list[Node | Any]: def _values(self) -> list[Node | Any]:
return self.nodes return self.nodes + self.pseudo_nodes
def intermediate_representation(self) -> list[ir.IRItem]: def intermediate_representation(self) -> list[ir.IRItem]:
result: list[ir.IRItem] = [] result: list[ir.IRItem] = []

View file

@ -170,10 +170,10 @@ class Parser:
if lbrace := self.accept(Tokens.Brace_Left): if lbrace := self.accept(Tokens.Brace_Left):
block = self.block(name="anon") block = self.block(name="anon")
rbrace = self.expect(Tokens.Brace_Right) 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): elif expr := self.expression(mandatory):
semicolon = PseudoNode(self.expect(Tokens.Semicolon)) semicolon = PseudoNode(self.expect(Tokens.Semicolon))
return Statement(expr, semicolon) return Statement(expr, pseudo_nodes=[semicolon])
elif mandatory: elif mandatory:
raise UnexpectedTokenError(expr, wanted="expression") raise UnexpectedTokenError(expr, wanted="expression")