Exemplo n.º 1
0
        public void SimpleTest2()
        {
            var Text =
                @"
{
  if (a > b) 
  {
    a = a;
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var ChangeVisitorsOptimization = new List <ChangeVisitor>
            {
                new SameAssignmentOptVisitor(),
                new NullIfElseOptVisitor(),
                new RemoveEmptyStatementVisitor(),
            };


            int countOptimization = 0;

            while (countOptimization < ChangeVisitorsOptimization.Count)
            {
                parser.root.Visit(ChangeVisitorsOptimization[countOptimization]);
                if (ChangeVisitorsOptimization[countOptimization].IsChanged)
                {
                    ChangeVisitorsOptimization[countOptimization].IsChanged = false;
                    countOptimization = 0;
                }
                else
                {
                    countOptimization++;
                }
            }


            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>();
            var actual   = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 2
0
        protected ControlFlowGraph GenerateCFG(string sourceCode)
        {
            Scanner scanner = new Scanner();

            scanner.SetSource(sourceCode, 0);

            Parser parser = new Parser(scanner);

            parser.Parse();

            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);

            var blocks = new TACBaseBlocks(TACGenerator.Instructions);

            blocks.GenBaseBlocks();
            var cfg = new ControlFlowGraph(blocks.blocks);

            return(cfg);
        }
Exemplo n.º 3
0
        protected ThreeAddressCode GenerateTAC(string sourceCode)
        {
            Scanner scanner = new Scanner();

            scanner.SetSource(sourceCode, 0);

            Parser parser = new Parser(scanner);

            parser.Parse();

            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            return(TACGenerator.TAC);

            /*
             * var TACBlocks = new TACBaseBlocks(TACGenerator.Instructions);
             * TACBlocks.GenBaseBlocks();
             * var cfg = new ControlFlowGraph(TACBlocks.blocks);
             */
        }
Exemplo n.º 4
0
        public void SimpleExample2()
        {
            var Text = (
                @"
{
  x = 7 - 8 * 0 + 3;
}
");
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var optimizer = new ConstantFoldingVisitor();

            parser.root.Visit(optimizer);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "x = 10"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 5
0
        public void OptimizationPipeline2()
        {
            var Text =
                @"
{
  x = 13;
  b = 14;
  if (x - x + 2 < a - a + 1 + 0)
  {
    x = x * (a - a);
    b = b;
  }
  if (true) 
  {
    a = 1;
  } 
  else 
  {
    a = 1;
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            AllVisitorsOptimization.Optimization(parser);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "x = 13",
                "b = 14",
                "a = 1"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 6
0
        public void ExprOptimization()
        {
            var Text =
                @"
{
  x = 13;
  b = 14;
  while (x < b)
  {
    x = (x * (a - a)) * 1;
    b = b;
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            AllVisitorsOptimization.Optimization(parser);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "x = 13",
                "b = 14",
                "#L0",
                "#t0 = x < b",
                "if #t0 goto #L1",
                "goto #L2",
                "#L1",
                "x = 0",
                "goto #L0",
                "#L2"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 7
0
        public void IfInsideWhile()
        {
            var Text =
                @"
{
  while (true)
  {
    if true
    {
      b = a;
    }
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var trueIfOpt = new TrueIfOptVisitor();

            parser.root.Visit(trueIfOpt);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "#L0",
                "if True goto #L1",
                "goto #L2",
                "#L1",
                "b = a",
                "goto #L0",
                "#L2"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
        public void TrueIfAndAlgebraicIdentities()
        {
            var Text =
                @"
{
  if true
  {
    x = x / 1;
    x = 1 * x;
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var trueIfOpt = new TrueIfOptVisitor();

            parser.root.Visit(trueIfOpt);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var AIOptimizer = new AlgebraicIdentitiesOptimizer(TAC);

            AIOptimizer.Run();

            var expected = new List <string>()
            {
                "x = x",
                "x = x"
            };

            var actual = AIOptimizer.TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 9
0
        public void OptimizationPipeline5()
        {
            var Text =
                @"
{
  c = 3;
  if (2 > 1) 
  {
    a = a;
  }
  else 
  {
    b = b;
    if (3 > 2) 
    {
      a = a;
    }
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            AllVisitorsOptimization.Optimization(parser);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "c = 3"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 10
0
        public void TrueConditionOptAndTrueIfOpt()
        {
            var Text =
                @"
{
  if a == a
  {
    b = a;
    c = a;
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var trueOpt = new TrueConditionOptVisitor();

            parser.root.Visit(trueOpt);

            var trueIfOpt = new TrueIfOptVisitor();

            parser.root.Visit(trueIfOpt);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "b = a",
                "c = a"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 11
0
        public void Test2()
        {
            var Text =
                @"
{
  b = 4;
  while (false)
  {
    b = b;
  }
  a = 33;
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var whileFalse = new WhileFalseVisitor();

            parser.root.Visit(whileFalse);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "b = 4",
                "a = 33"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 12
0
        public void WhileFalseOptimization()
        {
            var Text =
                @"
{
  x = 13;
  b = 14;
  while (7 - 7 == 3 - 1)
  {
    x = x * (a - a);
    b = b;
  }
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            AllVisitorsOptimization.Optimization(parser);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "x = 13",
                "b = 14"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
        protected ThreeAddressCode GenerateTAC(string sourceCode)
        {
            Scanner scanner = new Scanner();

            scanner.SetSource(sourceCode, 0);

            Parser parser = new Parser(scanner);

            parser.Parse();

            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            return(TACGenerator.TAC);
        }
Exemplo n.º 14
0
        public static TACBaseBlocks Optimize(Parser parser, bool debugInfo = false)
        {
            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TACBlocks = new TACBaseBlocks(TACGenerator.Instructions);

            TACBlocks.GenBaseBlocks();
            TACBaseBlocks result = TACBlocks;
            var           i      = 1;

            do
            {
                var oneBlockOptimizations = OptimizeBlock(result);
                if (debugInfo)
                {
                    Console.WriteLine("===============TAC EachBlockOpt: Stage {0}===============", i.ToString());
                    PrintInstructions(oneBlockOptimizations);
                    ++i;
                }
                result = AllOptimization(oneBlockOptimizations);
                if (debugInfo)
                {
                    Console.WriteLine("===============TAC AllBlocksOpt: Stage {0}===============", i.ToString());
                    PrintInstructions(result.BlockMerging());
                    ++i;
                }
                result = IterAlgoOptimizations(result);
                if (debugInfo)
                {
                    Console.WriteLine("=================TAC IterAlgs: Stage {0}=================", i.ToString());
                    PrintInstructions(result.BlockMerging());
                    ++i;
                }
            } while (GlobalOptimizationCount < 3);
            return(result);
        }
Exemplo n.º 15
0
        public override void Run()
        {
            var i = 1;

            while (i < Instructions.Count - 2)
            {
                if (Instructions[i] != null && Instructions[i].Operation.Equals("if goto"))
                {
                    if (Instructions[i + 1].Operation.Equals("goto"))
                    {
                        var tempName       = TACGenerationVisitor.GenerateTempName();
                        var notInstruction = new TACInstruction("!", Instructions[i].Argument1, "", tempName);
                        Instructions[i].Argument1 = tempName;
                        Instructions[i].Argument2 = Instructions[i + 1].Argument1;
                        Instructions[i + 1]       = null;
                        Instructions[i + 2]       = null;
                        Instructions.Insert(i, notInstruction);
                        ++i;
                    }
                }
                ++i;
            }
            Instructions = Instructions.Where(x => x != null).ToList();
        }
Exemplo n.º 16
0
        public void NestedTest4()
        {
            var Text =
                @"
{
if (a < b)
{
    a = a;
    a = b;
}
else
{
    b = b;
    n = 4;
}
b = b;
c = c;
c = j;
}
";
            Scanner scanner = new Scanner();

            scanner.SetSource(Text, 0);
            Parser parser = new Parser(scanner);

            parser.Parse();
            var parentFiller = new FillParentsVisitor();

            parser.root.Visit(parentFiller);

            var ChangeVisitorsOptimization = new List <ChangeVisitor>
            {
                new SameAssignmentOptVisitor(),
                new RemoveEmptyStatementVisitor()
            };


            int countOptimization = 0;

            while (countOptimization < ChangeVisitorsOptimization.Count)
            {
                parser.root.Visit(ChangeVisitorsOptimization[countOptimization]);
                if (ChangeVisitorsOptimization[countOptimization].IsChanged)
                {
                    ChangeVisitorsOptimization[countOptimization].IsChanged = false;
                    countOptimization = 0;
                }
                else
                {
                    countOptimization++;
                }
            }


            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TACGenerator = new TACGenerationVisitor();

            parser.root.Visit(TACGenerator);
            var TAC = TACGenerator.TAC;

            var expected = new List <string>()
            {
                "#t0 = a < b",
                "if #t0 goto #L0",
                "n = 4",
                "goto #L1",
                "#L0",
                "a = b",
                "#L1",
                "c = j"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }