public static void DumpPda(TestPdaConstructingContext root, StreamWriter outputWriter) { var nextIndex = 0; var indexes = new Dictionary <TestPdaConstructingContext, int>(ReferenceEqualityComparer.Default); int Indexer(TestPdaConstructingContext context) { var exists = indexes.TryGetValue(context, out var index); if (!exists) { index = nextIndex++; indexes[context] = index; } return(index); } var processed = new HashSet <TestPdaConstructingContext>(ReferenceEqualityComparer.Default); outputWriter.WriteLine("digraph Contexts {"); DumpPdaInternal(root, processed, Indexer, outputWriter); outputWriter.WriteLine("}"); }
private static void DumpPdaInternal( TestPdaConstructingContext current, HashSet <TestPdaConstructingContext> processed, Func <TestPdaConstructingContext, int> indexer, StreamWriter output) { if (processed.Contains(current)) { return; } processed.Add(current); var source = indexer(current); foreach (var transition in current.Transitions) { output.WriteLine($"{source} -> {indexer(transition.Target)} [label=\"{transition.Token.Tag}\"]"); DumpPdaInternal(transition.Target, processed, indexer, output); } }