示例#1
0
        public void simple_test(string expression)
        {
            var theoreticalNode      = new NodeAnalyzer().Parse(expression);
            var theoreticalResultSet = new double[_bound.StepCount + 1, _bound.StepCount + 1];

            _inRangeExpressionComputer.Compute(theoreticalNode, theoreticalResultSet, _bound);

            Node best = null;

            _geneticExpressionGenerator
            .Invoking
            (
                sut => best = sut.Generate
                              (
                    theoreticalResultSet,
                    _bound,
                    _bound,
                    Population,
                    GenerationCount,
                    GenerationDepth
                              )
            )
            .Should()
            .NotThrow();
            best.Should().NotBeNull();

            var printer = new PrettyPrintVisitor();

            printer.VisitNode(best);
            Console.WriteLine(printer.Output);
        }
示例#2
0
        internal static string GetASTWithOpt(Parser parser, List <int> lstCheck)
        {
            var b = parser.Parse();

            if (!b)
            {
                return("Error. AST not build");
            }

            var fillParents = new FillParentsVisitor();

            parser.root.Visit(fillParents);
            var listOpt = new List <ChangeVisitor>();

            if (lstCheck.Count > 0)
            {
                foreach (var n in lstCheck)
                {
                    listOpt.Add(ASTOptimizations[n]);
                }
                ASTOptimizer.Optimize(parser, listOpt);
            }

            var pp = new PrettyPrintVisitor();

            parser.root.Visit(pp);
            return(pp.Text);
        }
示例#3
0
        protected static string[] ApplyAstOpt(Parser AST, ChangeVisitor opt)
        {
            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            return(pp.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));
        }
示例#4
0
        private string[] ApplyOptimizations(Parser AST, List <ChangeVisitor> Optimizations = null)
        {
            ASTOptimizer.Optimize(AST, Optimizations);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            return(pp.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));
        }
        public void optimizer_in_action(string input, string optimized)
        {
            var node          = new NodeAnalyzer().Parse(input);
            var optimizedNode = new OptimizationMutator().MutateNode(node);
            var printer       = new PrettyPrintVisitor();

            printer.VisitNode(optimizedNode);
            printer.ToString().Should().Be(optimized);
        }
        static void Main(string[] args)
        {
            var    DirectoryPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
            string FileName      = Path.Combine(DirectoryPath, "a.txt");

            try
            {
                string Text = File.ReadAllText(FileName);
                Text = Text.Replace('\t', ' ');

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

                Parser parser = new Parser(scanner);

                var b      = parser.Parse();
                var r      = parser.root;
                var printv = new PrettyPrintVisitor(true);
                r.Visit(printv);
                Console.WriteLine("Текст программы:");
                Console.WriteLine(printv.Text);
                Console.WriteLine();
                var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();
                r.Visit(threeAddressCodeVisitor);
                threeAddressCodeVisitor.Postprocess();
                var cfg = new ControlFlowGraph(threeAddressCodeVisitor.TACodeContainer);
                Console.WriteLine("CFG: ");
                Console.WriteLine(cfg);
                Console.WriteLine("DominationBorder: ");
                foreach (var vertex in cfg.Vertices)
                {
                    Console.WriteLine();
                    Console.WriteLine("vertex: \n" + vertex);
                    var    borderSet = DominationBorder.Execute(cfg, vertex);
                    string borderStr = "";
                    foreach (var el in borderSet)
                    {
                        borderStr += el + "\n";
                    }
                    if (borderSet.Count() == 0)
                    {
                        borderStr = "Empty";
                    }
                    Console.WriteLine("borderSet: \n\n" + borderStr);
                    Console.WriteLine();
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e);
            }
        }
        public void Visit_IfNodeWithBoolExprTest()
        {
            var source = "if(a == 1){\n" +
                         "a = 3;\n" +
                         "}else{\n" +
                         "a = 4;\n" +
                         "}\n" +
                         "if(true){\n" +
                         "a = 42;\n" +
                         "}else{\n" +
                         "a = 24;\n" +
                         "}\n";

            var trueSource = "if(a == 1){\n" +
                             "a = 3;\n" +
                             "}else{\n" +
                             "a = 4;\n" +
                             "}\n" +
                             "{a = 42;}\n";


            var scanner1 = new Scanner();

            scanner1.SetSource(source, 0);

            var sourceParser = new Parser(scanner1);

            sourceParser.Parse();

            var fillParent = new FillParentVisitor();

            sourceParser.root.Visit(fillParent);

            var scanner2 = new Scanner();

            scanner2.SetSource(trueSource, 0);
            var trueSourceParser = new Parser(scanner2);

            trueSourceParser.Parse();

            var plusZeroExprVisitor = new IfNodeWithBoolExprVisitor();

            sourceParser.root.Visit(plusZeroExprVisitor);

            var printer1 = new PrettyPrintVisitor(true);
            var printer2 = new PrettyPrintVisitor(true);

            sourceParser.root.Visit(printer1);
            trueSourceParser.root.Visit(printer2);

            Console.WriteLine(printer1.Text);
            Console.WriteLine(printer2.Text);

            Assert.AreEqual(printer1.Text, printer2.Text);
        }
示例#8
0
        public void pretty_print_visitor(string expression)
        {
            var analyzer       = new NodeAnalyzer();
            var tree           = analyzer.Parse(expression);
            var computeVisitor = new PrettyPrintVisitor();

            computeVisitor.VisitNode(tree);
            var output = computeVisitor.Output;

            computeVisitor.Output.Should().NotBeNullOrEmpty();
            Console.WriteLine(output);
        }
        /// <summary>
        /// Создает Parser на основе Scanner и проходит по построенному дереву
        /// </summary>
        /// <param name="scanner">Scanner variable</param>
        /// <returns>
        /// Возвращает текст программы
        /// </returns>
        private static string ParseScanner(Scanner scanner)
        {
            var parser = new Parser(scanner);

            parser.Parse();

            var prettyPrintVisitor = new PrettyPrintVisitor();

            parser.root.Visit(prettyPrintVisitor);

            return(prettyPrintVisitor.Text);
        }
示例#10
0
        public static void Main()
        {
            string FileName = @"..\..\a.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("Ошибка");
                }
                else
                {
                    Console.WriteLine("Синтаксическое дерево построено");

                    var avis = new AssignCountVisitor();
                    parser.root.Visit(avis);
                    Console.WriteLine("Количество присваиваний = {0}", avis.Count);
                    Console.WriteLine("-------------------------------");

                    var pp = new PrettyPrintVisitor();
                    parser.root.Visit(pp);
                    Console.WriteLine(pp.Text);
                    Console.WriteLine("-------------------------------");

                    var code = new GenCodeVisitor();
                    parser.root.Visit(code);
                    code.EndProgram();
                    code.PrintCommands();
                    Console.WriteLine("-------------------------------");

                    code.RunProgram();
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e);
            }

            Console.ReadLine();
        }
示例#11
0
        public static void Main()
        {
            string FileName = @"..\..\a.txt";

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

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

                Parser parser = new Parser(scanner);

                var b = parser.Parse();

                // new 31.03.2020

                var r = parser.root;
                // Console.WriteLine(r);
                Console.WriteLine("Исходный текст программы");
                var printv = new PrettyPrintVisitor(true);
                r.Visit(printv);
                Console.WriteLine(printv.Text);
                Console.WriteLine("-------------------------------");
                // new 31.03.2020

                if (!b)
                {
                    Console.WriteLine("Ошибка");
                }
                else
                {
                    Console.WriteLine("Syntax tree was built: \n");
                    TacConstantsAndCopies(parser);
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (LexException e)
            {
                Console.WriteLine("Лексическая ошибка. " + e.Message);
            }
            catch (SyntaxException e)
            {
                Console.WriteLine("Синтаксическая ошибка. " + e.Message);
            }

            Console.WriteLine("Done. Press any key to continue.");
            Console.ReadKey();
        }
示例#12
0
        public static string Format(string text)
        {
            var result = ParseScript(
                text,
                flags: Flags.EnableExpressionChaining);

            // Can't pretty print a script with errors.
            if (result.HasError)
            {
                return(text);
            }

            return(PrettyPrintVisitor.Format(result.Root, result.Before, result.After, text));
        }
示例#13
0
        private static void CFGReducibility_DominatorTree_PrettyPrinter_Demonstration()
        {
            string fpath = @"..\..\..\CodeSamples\reducibilityBadSample.txt";

            astRoot = AST(fpath);
            if (astRoot == null)
            {
                return;
            }
            var tacodeVisitor = new TACodeVisitor();

            astRoot.Visit(tacodeVisitor);
            var prettyPrinter = new PrettyPrintVisitor();

            astRoot.Visit(prettyPrinter);
            var cfg     = new ControlFlowGraph(tacodeVisitor.Code);
            var domTree = new DominatorTree(cfg);

            Console.WriteLine("###### CFG Reducibility(#59 by APC TEAM) based on DominatorTree(#56 by ДВП)");
            Console.WriteLine("###### and PrettyPrinter(#5 by APC TEAM) DEMONSTARTION:");
            Console.WriteLine("######       Sample 1:");
            Console.WriteLine(prettyPrinter.Text);
            Console.WriteLine("###### Dominator Tree Matrix:");
            Console.WriteLine(domTree.ToString());
            Console.WriteLine($"###### CFG is reducible: {cfg.IsReducible}");
            Console.WriteLine($"###### CFG depth is: {cfg.Depth}");


            fpath   = @"..\..\..\CodeSamples\reducibilityGoodSample.txt";
            astRoot = null;
            astRoot = AST(fpath);
            if (astRoot == null)
            {
                return;
            }
            tacodeVisitor = new TACodeVisitor();
            astRoot.Visit(tacodeVisitor);
            prettyPrinter = new PrettyPrintVisitor();
            astRoot.Visit(prettyPrinter);
            cfg     = new ControlFlowGraph(tacodeVisitor.Code);
            domTree = new DominatorTree(cfg);
            Console.WriteLine("###########################################");
            Console.WriteLine("######       Sample 2:");
            Console.WriteLine("###### Program text from PrettyPrinter:\n");
            Console.WriteLine(prettyPrinter.Text);
            Console.WriteLine("###### Dominator Tree Matrix:");
            Console.WriteLine(domTree.ToString());
            Console.WriteLine($"###### CFG is reducible: {cfg.IsReducible}");
        }
示例#14
0
        public void TestShouldCreateNoop()
        {
            var AST      = BuildAST(@"var a;
while false
   a = true;");
            var expected = @"var a;
";

            var opt = new OptWhileFalseVisitor();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#15
0
        public void FoldInPrintTest()
        {
            var AST      = BuildAST(@"
var a, b;
print(4 + 5, 2 - 1, 6 / 3, 2 * 5);
");
            var expected = @"var a, b;
print(9, 1, 2, 10);";

            var opt = new OptExprAlgebraic();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#16
0
        public void MultWithRightLeftZero()
        {
            var AST      = BuildAST(@"
var a, b;
a = 0 * b + b * a * 0 + 5;
");
            var expected = @"var a, b;
a = ((0 + 0) + 5);";

            var opt = new OptExprMultZero();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#17
0
        public void DivNumTest()
        {
            var AST      = BuildAST(@"
var a, b;
a = 546 / 13;
");
            var expected = @"var a, b;
a = 42;";

            var opt = new OptExprAlgebraic();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#18
0
        public void DivByRightOne()
        {
            var AST      = BuildAST(@"
var a, b;
a = b / 1;
");
            var expected = @"var a, b;
a = b;";

            var opt = new OptExprMultDivByOne();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#19
0
        public void MultAndDivByLeftRightOne()
        {
            var AST      = BuildAST(@"
var a, b;
a = 1 * a * 1 + (1 * b / 1) * 1 / 1;
");
            var expected = @"var a, b;
a = (a + b);";

            var opt = new OptExprMultDivByOne();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#20
0
        public void FoldComplexTest()
        {
            var AST      = BuildAST(@"
var a, b;
a = 42 / 6 * 3 - 3 * (1 + 1) - 2;
");
            var expected = @"var a, b;
a = 13;";

            var opt = new OptExprAlgebraic();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#21
0
        public void SubIDInPrintTest()
        {
            var AST      = BuildAST(@"
var a, b;
print(a - a, b - b, b - a, a - a - b);
");
            var expected = @"var a, b;
print(0, 0, (b - a), (0 - b));";

            var opt = new OptExprSubEqualVar();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#22
0
        public void SubIDTest()
        {
            var AST      = BuildAST(@"
var a, b;
a = b - b;
");
            var expected = @"var a, b;
a = 0;";

            var opt = new OptExprSubEqualVar();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
示例#23
0
        public void SumWithRightZero()
        {
            var AST      = BuildAST(@"
var a, b;
a = b + 0;
");
            var expected = @"var a, b;
a = b;";

            var opt = new OptExprSumZero();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
        public void Visit_PlusZeroExprTest()
        {
            var source = "a = 1;\n" +
                         "b = 1 + 0;\n" +
                         "var1 = 0 + b;";

            var trueSource = "a = 1;\n" +
                             "b = 1;\n" +
                             "var1 = b;\n";

            var scanner1 = new Scanner();

            scanner1.SetSource(source, 0);

            var sourceParser = new Parser(scanner1);

            sourceParser.Parse();

            var fillParent = new FillParentVisitor();

            sourceParser.root.Visit(fillParent);

            var scanner2 = new Scanner();

            scanner2.SetSource(trueSource, 0);
            var trueSourceParser = new Parser(scanner2);

            trueSourceParser.Parse();

            var plusZeroExprVisitor = new PlusZeroExprVisitor();

            sourceParser.root.Visit(plusZeroExprVisitor);

            var printer1 = new PrettyPrintVisitor(true);
            var printer2 = new PrettyPrintVisitor(true);

            sourceParser.root.Visit(printer1);
            trueSourceParser.root.Visit(printer2);

            Console.WriteLine(printer1.Text);
            Console.WriteLine(printer2.Text);

            Assert.AreEqual(printer1.Text, printer2.Text);
        }
示例#25
0
        public void IfTrueTest()
        {
            var AST      = BuildAST(@"
var a, b;
if true
a = b;
else
a = 1;
");
            var expected = @"var a, b;
a = b;";

            var opt = new OptStatIfTrue();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
        public void RemoveNode()
        {
            var AST      = BuildAST(@"
var a, b;
a = a;
{ b = b; }
");
            var expected = @"var a, b;

{

}";
            var opt      = new OptAssignEquality();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
        public void WithoutRemoveConstants()
        {
            var AST      = BuildAST(@"var a;
a = a + 0;
a = a - 0;
a = a * 1;
");
            var expected = @"var a;
a = (a + 0);
a = (a - 0);
a = (a * 1);";

            var opt = new OptAssignEquality();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
        public void SumNumTest()
        {
            var AST      = BuildAST(@"var b, c, d;
b = true == true;
while (5 == 5)
  c = true == false;
d = 7 == 8;");
            var expected = @"var b, c, d;
b = true;
while true
  c = false;
d = false;";

            var opt = new OptExprEqualBoolNum();

            AST.root.Visit(opt);
            var pp = new PrettyPrintVisitor();

            AST.root.Visit(pp);
            Assert.AreEqual(expected, pp.Text);
        }
        public void Visit_ConstFoldingTests()
        {
            var source = "x = 50 * 10;";

            var trueSource = "x = 500;";

            var scanner1 = new Scanner();

            scanner1.SetSource(source, 0);

            var sourceParser = new Parser(scanner1);

            sourceParser.Parse();

            var fillParent = new FillParentVisitor();

            sourceParser.root.Visit(fillParent);

            var scanner2 = new Scanner();

            scanner2.SetSource(trueSource, 0);
            var trueSourceParser = new Parser(scanner2);

            trueSourceParser.Parse();

            var cfv = new ConstFoldingVisitor();

            sourceParser.root.Visit(cfv);

            var printer1 = new PrettyPrintVisitor(true);
            var printer2 = new PrettyPrintVisitor(true);

            sourceParser.root.Visit(printer1);
            trueSourceParser.root.Visit(printer2);

            Console.WriteLine(printer1.Text);
            Console.WriteLine(printer2.Text);

            Assert.AreEqual(printer1.Text, printer2.Text);
        }
        public void Visit_DelOfDeadConditionsTests()
        {
            var source = "if(a == b){;}else{;}";

            var trueSource = ";";

            var scanner1 = new Scanner();

            scanner1.SetSource(source, 0);

            var sourceParser = new Parser(scanner1);

            sourceParser.Parse();

            var fillParent = new FillParentVisitor();

            sourceParser.root.Visit(fillParent);

            var scanner2 = new Scanner();

            scanner2.SetSource(trueSource, 0);
            var trueSourceParser = new Parser(scanner2);

            trueSourceParser.Parse();

            var dodcv = new DelOfDeadConditionsVisitor();

            sourceParser.root.Visit(dodcv);

            var printer1 = new PrettyPrintVisitor(true);
            var printer2 = new PrettyPrintVisitor(true);

            sourceParser.root.Visit(printer1);
            trueSourceParser.root.Visit(printer2);

            Console.WriteLine(printer1.Text);
            Console.WriteLine(printer2.Text);

            Assert.AreEqual(printer1.Text, printer2.Text);
        }
示例#31
0
文件: Program.cs 项目: zuzhu/SPINA
 //----< constructor >------------------------------
 public consoleProgram()
 {
     interp_visitor = new InterpreterVisitor();
     print_visitor = new PrettyPrintVisitor();
 }