// Естественные циклы с общим заголовком Если два естественных цикла имеют общий заголовок,
        // то будем считать, что они образуют один естественный цикл
        private void MergeLoopsWithCommonEntryBlock()
        {
            var commonStart = new Dictionary <ThreeAddressCode, HashSet <CFGNaturalCycle> >();

            foreach (var cycle in Cycles)
            {
                var entry = cycle.EntryBlock;
                if (!commonStart.Keys.Contains(entry))
                {
                    commonStart.Add(entry, new HashSet <CFGNaturalCycle>());
                }
                commonStart[entry].Add(cycle);
            }
            foreach (var pair in commonStart)
            {
                var oldCycles = pair.Value;
                if (oldCycles.Count() > 1)
                {
                    var newCycle = new CFGNaturalCycle(oldCycles);
                    foreach (var oldCycle in oldCycles)
                    {
                        Cycles.Remove(oldCycle);
                    }
                    Cycles.Add(newCycle);
                }
            }
        }
        // Естественные циклы
        public CFGNaturalCycles(ControlFlowGraph cfg)
        {
            var edgeClassifierService = new EdgeClassifierService(cfg);
            // Для данного обратного ребра n → d определим естественный цикл ребра как d плюс
            // множество узлов, которые могут достичь n не проходя через d.
            var retreatingEdges = edgeClassifierService.RetreatingEdges;

            Cycles = new HashSet <CFGNaturalCycle>();
            foreach (var edge in retreatingEdges)
            {
                // Запуск алгоритма построения естественного цикла
                var cycle = new CFGNaturalCycle(cfg, edge);
                Cycles.Add(cycle);
            }
            //Console.WriteLine(ToString());
            //Console.WriteLine("MergeLoopsWithCommonEntryBlock");
            // Объединение циклов с общим заголовком в один
            MergeLoopsWithCommonEntryBlock();
            //Console.WriteLine(ToString());
            // Заполнение информации о вложенности циклов
            DefinitionNestingForCycles();
        }
Ejemplo n.º 3
0
 public bool IsContainsCycle(CFGNaturalCycle cycle)
 {
     if (IsVerticesEmpty || cycle.IsVerticesEmpty)
     {
         return(false);
     }
     if (Vertices.Contains(cycle.EntryBlock))
     {
         bool res = true;
         foreach (var exit in cycle.ExitBlocks)
         {
             if (!Vertices.Contains(exit))
             {
                 res = false;
             }
         }
         return(res);
     }
     else
     {
         return(false);
     }
 }