// Естественные циклы с общим заголовком Если два естественных цикла имеют общий заголовок, // то будем считать, что они образуют один естественный цикл 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(); }
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); } }