Beispiel #1
0
        public void FindReverseEdges3()
        {
            string programText = @"
            for i = 1..10
              if i < 5
                println(i);
              else
                println(i-5);
            ";

            SyntaxNode      root             = ParserWrap.Parse(programText);
            var             threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;
            BasicBlocksList basicBlocks      = BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode);
            Graph           g            = new Graph(basicBlocks);
            var             reverseEdges = FindReverseEdge.FindReverseEdges(g);

            List <Tuple <int, int> > tuples = new List <Tuple <int, int> >();

            foreach (var v in reverseEdges)
            {
                Trace.WriteLine(v.Source.BlockId + " -> " + v.Target.BlockId);
                tuples.Add(new Tuple <int, int>(v.Source.BlockId, v.Target.BlockId));
            }

            int start = g.GetMinBlockId();

            Assert.IsTrue(tuples.SequenceEqual(new List <Tuple <int, int> >()
            {
                new Tuple <int, int>(start + 5, start + 1)
            }
                                               ));
        }
        public static bool CheckReverseEdges(ControlFlowGraph.Graph g)
        {
            Dictionary <Edge <BasicBlock>, EdgeType> ClassifiedEdges = EdgeClassification.EdgeClassification.ClassifyEdge(g);
            var RetreatingEdges = ClassifiedEdges.Where(x => x.Value == EdgeType.Retreating).Select(x => x.Key);

            var ReverseEdges = FindReverseEdge.FindReverseEdges(g);

            return(ReverseEdges.SetEquals(RetreatingEdges));
        }