Пример #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);
        }
        public static void Optimization(Parser parser, bool debugInfo = false)
        {
            var prettyPrinter     = new PrettyPrinterVisitor();
            int countOptimization = 0;

            while (countOptimization < ChangeVisitorsOptimization.Count)
            {
                parser.root.Visit(ChangeVisitorsOptimization[countOptimization]);
                if (ChangeVisitorsOptimization[countOptimization].IsChanged)
                {
                    ChangeVisitorsOptimization[countOptimization].IsChanged = false;
                    countOptimization = 0;
                }
                else
                {
                    countOptimization++;
                }
            }
            if (debugInfo)
            {
                parser.root.Visit(prettyPrinter);
                Console.WriteLine("==================Visitors Optimizations==================");
                Console.WriteLine(prettyPrinter.FormattedProgram);
            }
        }
Пример #3
0
        public void IfAterIf()
        {
            var Text =
                @"
{
  if a == a
  {
    b = a;
  }

  if b == b
  {
    c = b;
  }
  else
  {
    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 prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TAC = GenerateTAC(prettyPrinter.FormattedProgram);

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

            CollectionAssert.AreEqual(expected, actual);
        }
        public void AllDividedTestCasesTest()
        {
            var     Text = (@"{
a = 1;
b = 1;
c = 0;
c = c/c/1;
if 1*a + 1*b
{
c = a * b * 1;
}
q = a/1 + 5;
q = c + 0;
}");
            Scanner scanner = new Scanner();

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

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

            parser.root.Visit(parentFiller);

            var ProdDiv = new AlgebraicIdentityProdDiv1Visitor();
            var Sum     = new AlgebraicIdentitySum0Visitor();

            ProdDiv.Visit(parser.root);
            Sum.Visit(parser.root);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);
            var TAC = GenerateTAC(prettyPrinter.FormattedProgram);

            var expected = new List <string>()
            {
                "a = 1",
                "b = 1",
                "c = 0",
                "c = c / c",
                "#t0 = a + b",
                "if #t0 goto #L0",
                "goto #L1",
                "#L0",
                "c = a * b",
                "#L1",
                "q = a + 5",
                "q = c"
            };
            var actual = TAC.Instructions.Select(instruction => instruction.ToString().Trim());

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #13
0
        static void Main(string[] args)
        {
            LiteralNode n = LiteralNode.One;

            Console.WriteLine($"Checking that the new child has {n.ChildCount} children, with value {n}!");
            var nil = NilNode.Nil;

            Console.WriteLine($"The node nil is {nil}.");
            var sum = n + (Node)6;

            Console.WriteLine($"The node sum is {sum}");
            var sub = nil - (Node)6;

            Console.WriteLine($"The node sum is {sub}");
            NodeVisitor v = new PrettyPrinterVisitor();

            n.Accept(v);
            Console.WriteLine("Done!");
        }
Пример #14
0
        public void Test2()
        {
            var text =
                @"{
            c = 4;
            b = 5;
            a = b*0 + 0*c;
            }";
            Scanner scanner = new Scanner();

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

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

            parser.root.Visit(parentFiller);

            var Opt = new MultiplyOnZero();

            parser.root.Visit(Opt);

            var Opt2 = new MultiplyOnZero2();

            parser.root.Visit(Opt2);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TAC = GenerateTAC(prettyPrinter.FormattedProgram);

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

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #15
0
        public void Test1()
        {
            var Text =
                @"{
b = 5;
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);

            var Opt = new MinusSelf();

            parser.root.Visit(Opt);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TAC = GenerateTAC(prettyPrinter.FormattedProgram);

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

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #16
0
        public void SimpleOptimization()
        {
            var Text =
                @"
{
  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);

            AllVisitorsOptimization.Optimization(parser);

            var prettyPrinter = new PrettyPrinterVisitor();

            parser.root.Visit(prettyPrinter);

            var TAC = GenerateTAC(prettyPrinter.FormattedProgram);

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

            CollectionAssert.AreEqual(expected, actual);
        }
Пример #17
0
        public static void Main()
        {
            string FileName = @"..\..\b.txt";

            try
            {
                string Text = File.ReadAllText(FileName);

                Scanner scanner = new Scanner();
                scanner.SetSource(Text, 0);

                Parser parser = new Parser(scanner);

                var b = parser.Parse();
                if (!b)
                {
                    Console.WriteLine("Error");
                }
                else
                {
                    Console.WriteLine("Syntax tree has been built");
                    //foreach (var st in parser.root.StList)
                    //Console.WriteLine(st);
                }

                var parentFiller = new FillParentsVisitor();
                parser.root.Visit(parentFiller);

                /*
                 * var assCounter = new AssignCountVisitor();
                 * parser.root.Visit(assCounter);
                 * Console.WriteLine("AssignCount = " + assCounter.AssignCount);
                 * Console.WriteLine();
                 */

                var prettyPrinter = new PrettyPrinterVisitor();
                parser.root.Visit(prettyPrinter);
                Console.WriteLine(prettyPrinter.FormattedProgram);

                var trueOpt = new TrueConditionOptVisitor();
                parser.root.Visit(trueOpt);

                Console.WriteLine("========================================================================");
                prettyPrinter = new PrettyPrinterVisitor();
                parser.root.Visit(prettyPrinter);
                Console.WriteLine(prettyPrinter.FormattedProgram);

                var trueIfOpt = new TrueIfOptVisitor();
                parser.root.Visit(trueIfOpt);

                Console.WriteLine("========================================================================");
                prettyPrinter = new PrettyPrinterVisitor();
                parser.root.Visit(prettyPrinter);
                Console.WriteLine(prettyPrinter.FormattedProgram);
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (LexException e)
            {
                Console.WriteLine("Лексическая ошибка. " + e.Message);
            }
            catch (SyntaxException e)
            {
                Console.WriteLine("Синтаксическая ошибка. " + e.Message);
            }

            Console.ReadLine();
        }
Пример #18
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);
        }