Starts and ends in the output

This commit is contained in:
John Doty 2024-05-30 08:36:35 -07:00
parent dfef449c33
commit 4b8fef9ad6

View file

@ -38,6 +38,8 @@ class TokenValue:
@dataclass @dataclass
class Tree: class Tree:
name: str | None name: str | None
start: int
end: int
children: typing.Tuple["Tree | TokenValue", ...] children: typing.Tuple["Tree | TokenValue", ...]
@ -90,7 +92,12 @@ def parse(table: parser.ParseTable, tokens, trace=None) -> typing.Tuple[Tree | N
else: else:
children.append(c) children.append(c)
value = Tree(name=name if not transparent else None, children=tuple(children)) value = Tree(
name=name if not transparent else None,
start=children[0].start,
end=children[-1].end,
children=tuple(children),
)
stack = stack[:-size] stack = stack[:-size]
goto = table.gotos[stack[-1][0]].get(name) goto = table.gotos[stack[-1][0]].get(name)
@ -355,14 +362,14 @@ class Harness:
def format_node(self, lines, node: Tree | TokenValue, indent=0): def format_node(self, lines, node: Tree | TokenValue, indent=0):
"""Print out an indented concrete syntax tree, from parse().""" """Print out an indented concrete syntax tree, from parse()."""
match node: match node:
case Tree(name, children): case Tree(name=name, start=start, end=end, children=children):
lines.append((" " * indent) + (name or "???")) lines.append((" " * indent) + f"{name or '???'} [{start}, {end})")
for child in children: for child in children:
self.format_node(lines, child, indent + 2) self.format_node(lines, child, indent + 2)
case TokenValue(kind=kind, start=start, end=end): case TokenValue(kind=kind, start=start, end=end):
assert self.source is not None assert self.source is not None
value = self.source[start:end] value = self.source[start:end]
lines.append((" " * indent) + f"{kind}:'{value}'") lines.append((" " * indent) + f"{kind}:'{value}' [{start}, {end})")
if __name__ == "__main__": if __name__ == "__main__":