Path: blob/main/Tools/peg_generator/pegen/grammar_visualizer.py
12 views
import argparse1import sys2from typing import Any, Callable, Iterator34from pegen.build import build_parser5from pegen.grammar import Grammar, Rule67argparser = argparse.ArgumentParser(8prog="pegen", description="Pretty print the AST for a given PEG grammar"9)10argparser.add_argument("filename", help="Grammar description")111213class ASTGrammarPrinter:14def children(self, node: Rule) -> Iterator[Any]:15for value in node:16if isinstance(value, list):17yield from value18else:19yield value2021def name(self, node: Rule) -> str:22if not list(self.children(node)):23return repr(node)24return node.__class__.__name__2526def print_grammar_ast(self, grammar: Grammar, printer: Callable[..., None] = print) -> None:27for rule in grammar.rules.values():28printer(self.print_nodes_recursively(rule))2930def print_nodes_recursively(self, node: Rule, prefix: str = "", istail: bool = True) -> str:31children = list(self.children(node))32value = self.name(node)3334line = prefix + ("└──" if istail else "├──") + value + "\n"35sufix = " " if istail else "│ "3637if not children:38return line3940*children, last = children41for child in children:42line += self.print_nodes_recursively(child, prefix + sufix, False)43line += self.print_nodes_recursively(last, prefix + sufix, True)4445return line464748def main() -> None:49args = argparser.parse_args()5051try:52grammar, parser, tokenizer = build_parser(args.filename)53except Exception as err:54print("ERROR: Failed to parse grammar file", file=sys.stderr)55sys.exit(1)5657visitor = ASTGrammarPrinter()58visitor.print_grammar_ast(grammar)596061if __name__ == "__main__":62main()636465