Exemplo n.º 1
0
        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("}");
        }
Exemplo n.º 2
0
        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);
            }
        }