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