Exemplo n.º 1
0
        public void ThisIsAwfulTestDontMakeItWorse()
        {
            string FileName = @"../../../a.txt";

            try
            {
                string     text = File.ReadAllText(FileName);
                SyntaxNode root = ParserWrap.Parse(text);
                Trace.WriteLine(root == null ? "Ошибка" : "Программа распознана");
                if (root != null)
                {
                    var prettyPrintedProgram = PrettyPrinter.CreateAndVisit(root).FormattedCode;
                    Trace.WriteLine(prettyPrintedProgram);

                    var threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;
                    Trace.WriteLine(threeAddressCode);

                    Trace.WriteLine("\nУправляющий граф программы");
                    Graph g = new Graph(BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode));

                    Trace.WriteLine(g);

                    Trace.WriteLine("Дерево доминаторов");
                    var dTree = new DominatorsTree(g);
                    Trace.WriteLine(dTree);

                    Trace.WriteLine("Классификация рёбер");
                    var classEdge = EdgeClassification.ClassifyEdge(g);
                    foreach (var p in classEdge)
                    {
                        Trace.WriteLine(p.Key.Source.BlockId + "->" + p.Key.Target.BlockId + "; type = " + p.Value);
                    }

                    Trace.WriteLine("\nНахождение естественных циклов");
                    var findNL = SearchNaturalLoops.FindAllNaturalLoops(g);
                    foreach (var nl in findNL)
                    {
                        Trace.Write(nl.Key.Source.BlockId + "->" + nl.Key.Target.BlockId + ": ");
                        foreach (var node in nl.Value)
                        {
                            Trace.Write(node.ToString() + " ");
                        }
                        Trace.WriteLine("");
                    }

                    Trace.WriteLine(("\nПостроение глубинного остовного дерева"));
                    var DFN = g.GetDFN();
                    foreach (var node in DFN)
                    {
                        Trace.WriteLine("key: " + node.Key + " " + "value: " + node.Value);
                    }

                    List <Region> regions = new List <Region>();
                    foreach (BasicBlock v in g)
                    {
                        regions.Add(new LeafRegion(v));
                    }

                    foreach (var l in findNL)
                    {
                        List <Region> regs = l.Value.Select(x => new LeafRegion(g.getBlockById(x)) as Region).ToList();
                        regions.Add(new LoopRegion(new BodyRegion(l.Key.Target, l.Key.Source.OutputBlocks, regs)));
                    }
                }
            }
            catch (FileNotFoundException)
            {
                Trace.WriteLine("Файл {0} не найден", FileName);
            }
            catch (LexException e)
            {
                Trace.WriteLine("Лексическая ошибка. " + e.Message);
            }
            catch (SyntaxException e)
            {
                Trace.WriteLine("Синтаксическая ошибка. " + e.Message);
            }
        }
        public void EdgeClassificationTest()
        {
            string programText_1 = @"
b = 1;
if 1 
  b = 3;
else
  b = 2;
";

            string programText_2 = @"
b = 1;
if 1
  b = 3;
else
  for i = 1..5
    b = 6;
";

            string programText_3 = @"
i = 10;
1: i = i - 1;
if i > 0
  goto 1;
";

            Trace.WriteLine("===============");
            Trace.WriteLine("Тест 1");
            Trace.WriteLine("===============");
            SyntaxNode root             = ParserWrap.Parse(programText_1);
            var        threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;

            Trace.WriteLine(threeAddressCode);

            var basicBlocks = BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode);

            Trace.WriteLine(Environment.NewLine + "Базовые блоки");
            Trace.WriteLine(basicBlocks);

            Trace.WriteLine(Environment.NewLine + "Управляющий граф программы");
            Graph g = new Graph(basicBlocks);

            Trace.WriteLine(g);

            var edgeClassify = EdgeClassification.ClassifyEdge(g);
            List <Tuple <int, int, EdgeType> > tuples = new List <Tuple <int, int, EdgeType> >();

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

            int start = g.GetMinBlockId();

            Assert.IsTrue(tuples.SequenceEqual(new List <Tuple <int, int, EdgeType> >()
            {
                new Tuple <int, int, EdgeType>(start, start + 1, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start, start + 2, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 1, start + 3, EdgeType.Cross),
                new Tuple <int, int, EdgeType>(start + 2, start + 3, EdgeType.Cross)
            }
                                               ));

            Trace.WriteLine("===============");
            Trace.WriteLine("Тест 2");
            Trace.WriteLine("===============");

            root             = ParserWrap.Parse(programText_2);
            threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;
            Trace.WriteLine(threeAddressCode);

            basicBlocks = BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode);
            Trace.WriteLine(Environment.NewLine + "Базовые блоки");
            Trace.WriteLine(basicBlocks);

            Trace.WriteLine(Environment.NewLine + "Управляющий граф программы");
            g = new Graph(basicBlocks);
            Trace.WriteLine(g);

            edgeClassify = EdgeClassification.ClassifyEdge(g);
            tuples       = new List <Tuple <int, int, EdgeType> >();
            foreach (var v in edgeClassify)
            {
                Trace.WriteLine(v.Key.Source.BlockId + " -> " + v.Key.Target.BlockId + " : " + v.Value);
                tuples.Add(new Tuple <int, int, EdgeType>(v.Key.Source.BlockId, v.Key.Target.BlockId, v.Value));
            }

            start = g.GetMinBlockId();

            Assert.IsTrue(tuples.SequenceEqual(new List <Tuple <int, int, EdgeType> >()
            {
                new Tuple <int, int, EdgeType>(start, start + 1, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start, start + 2, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 1, start + 6, EdgeType.Cross),
                new Tuple <int, int, EdgeType>(start + 2, start + 3, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 3, start + 4, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 3, start + 5, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 4, start + 3, EdgeType.Retreating),
                new Tuple <int, int, EdgeType>(start + 5, start + 6, EdgeType.Cross)
            }
                                               ));

            Trace.WriteLine("===============");
            Trace.WriteLine("Тест 3");
            Trace.WriteLine("===============");

            root             = ParserWrap.Parse(programText_3);
            threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;
            Trace.WriteLine(threeAddressCode);

            basicBlocks = BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode);
            Trace.WriteLine(Environment.NewLine + "Базовые блоки");
            Trace.WriteLine(basicBlocks);

            Trace.WriteLine(Environment.NewLine + "Управляющий граф программы");
            g = new Graph(basicBlocks);
            Trace.WriteLine(g);

            edgeClassify = EdgeClassification.ClassifyEdge(g);
            tuples       = new List <Tuple <int, int, EdgeType> >();
            foreach (var v in edgeClassify)
            {
                Trace.WriteLine(v.Key.Source.BlockId + " -> " + v.Key.Target.BlockId + " : " + v.Value);
                tuples.Add(new Tuple <int, int, EdgeType>(v.Key.Source.BlockId, v.Key.Target.BlockId, v.Value));
            }

            start = g.GetMinBlockId();

            Assert.IsTrue(tuples.SequenceEqual(new List <Tuple <int, int, EdgeType> >()
            {
                new Tuple <int, int, EdgeType>(start, start + 1, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 1, start + 2, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 1, start + 3, EdgeType.Advancing),
                new Tuple <int, int, EdgeType>(start + 2, start + 1, EdgeType.Retreating)
            }
                                               ));
        }