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); }
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); }
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); */ }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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(); }
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); }