private void UpdateTab(Modes m, TextBox txt) { if (FileName.Length == 0) { txt.Text = "File is not set"; return; } try { string tt = System.IO.File.ReadAllText(FileName); if (m == Modes.Text) { txt.Text = tt; return; } SimpleScanner.Scanner scan = new SimpleScanner.Scanner(); scan.SetSource(tt, 0); SimpleParser.Parser pars = new SimpleParser.Parser(scan); var b = pars.Parse(); if (!b) { txt.Text = "Ошибка парсинга"; return; } var r = pars.root; SimpleLang.Visitors.FillParentVisitor parVisitor = new SimpleLang.Visitors.FillParentVisitor(); r.Visit(parVisitor); SimpleLang.Visitors.AutoApplyVisitor optAst = GetASTOptimizer(); optAst.Apply(r); if (m == Modes.ASTOpt) { SimpleLang.Visitors.PrettyPrintVisitor vis = new SimpleLang.Visitors.PrettyPrintVisitor(); r.Visit(vis); txt.Text = vis.Text; return; } SimpleLang.Visitors.ThreeAddressCodeVisitor threeCodeVisitor = new SimpleLang.Visitors.ThreeAddressCodeVisitor(); r.Visit(threeCodeVisitor); if (m == Modes.BeforeThreeCode) { txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(threeCodeVisitor.GetCode()); Console.WriteLine(txt.Text); return; } if (m == Modes.BeforeRun) { SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); gen.Generate(threeCodeVisitor.GetCode()); var timer = System.Diagnostics.Stopwatch.StartNew(); string res = gen.Execute(); timer.Stop(); res = res + "\n\n\nExecuted: " + timer.ElapsedMilliseconds.ToString() + " ms" + " or " + timer.ElapsedTicks.ToString() + " ticks"; txt.Text = res; return; } if (m == Modes.BeforeBlocks) { var blocks = new SimpleLang.Block.Block(threeCodeVisitor).GenerateBlocks(); txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(blocks); return; } var opt = GetOptimiser(); var outcode = opt.Apply(threeCodeVisitor); if (m == Modes.AfterBlocks) { txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(outcode); return; } if (m == Modes.AfterTbreeCode) { System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode> res = new System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode>(); foreach (var block in outcode) { foreach (SimpleLang.Visitors.ThreeCode code in block) { res.AddLast(code); } } txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(res); Console.WriteLine(txt.Text); return; } if (m == Modes.AfterRun) { System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode> res = new System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode>(); foreach (var block in outcode) { foreach (SimpleLang.Visitors.ThreeCode code in block) { res.AddLast(code); } } SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); gen.Generate(res); var timer = System.Diagnostics.Stopwatch.StartNew(); string ooo = gen.Execute(); timer.Stop(); ooo = ooo + "\n\n\nExecuted: " + timer.ElapsedMilliseconds.ToString() + " ms" + " or " + timer.ElapsedTicks.ToString() + " ticks"; txt.Text = ooo; return; } txt.Text = "Is not implemented"; } catch (Exception e) { txt.Text = e.ToString(); } }
public static void Main(string[] args) { string FileName = @"../../../data/ASTOpt.txt"; if (args.Length > 0) { FileName = args[0]; } 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 r = parser.root; FillParentVisitor generateParrent = new FillParentVisitor(); r.Visit(generateParrent); { AutoApplyVisitor vis = new AutoApplyVisitor(); vis.Add(new OptWhileVisitor()); vis.Add(new SimpleLang.AstOptimisations.LinearizeBlocks()); vis.Add(new SimpleLang.Visitors.Opt2Visitor()); vis.Add(new SimpleLang.Visitors.Opt11Visitor()); vis.Add(new SimpleLang.Visitors.OptVisitor_8()); vis.Add(new SimpleLang.Visitors.OptVisitor_13()); vis.Add(new SimpleLang.Optimisations.OptSimilarDifference()); vis.Add(new SimpleLang.Optimisations.OptSimilarAssignment()); vis.Add(new SimpleLang.Visitors.OptMulDivOneVisitor()); vis.Add(new SimpleLang.Visitors.OptWhileVisitor()); vis.Add(new SimpleLang.Visitors.PlusNonZero()); vis.Add(new SimpleLang.Visitors.ElseStVisitor()); vis.Add(new SimpleLang.Visitors.LessOptVisitor()); vis.Add(new SimpleLang.Visitors.MultiplicationComputeVisitor()); vis.Add(new SimpleLang.Visitors.Opt7Visitor()); vis.Add(new SimpleLang.AstOptimisations.LinearizeBlocks()); vis.Add(new SimpleLang.AstOptimisations.FalseExprMoreAndNonEqualVisitor()); vis.Add(new SimpleLang.Visitors.DeleteNullVisitor()); vis.Apply(r); ThreeAddressCodeVisitor treeCod2e = new ThreeAddressCodeVisitor(); r.Visit(treeCod2e); SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); gen.Generate(treeCod2e.GetCode()); gen.PrintCommands(); string res = gen.Execute(); Console.WriteLine(res); //var blocks = new Block(treeCod2e).GenerateBlocks(); AutoThreeCodeOptimiser ap2p = new AutoThreeCodeOptimiser(); ap2p.Add(new DistributionOfConstants()); ap2p.Add(new SimpleLang.ThreeCodeOptimisations.EvalConstExpr()); ap2p.Add(new SimpleLang.ThreeCodeOptimisations.DeadOrAliveOptimizationAdapter()); var blockwss = ap2p.Apply(treeCod2e); Console.WriteLine(ThreeAddressCodeVisitor.ToString(blockwss)); CFG controlFlowGraph2 = new CFG(blockwss); Console.WriteLine("\nГлубина графа:\n" + GraphDepth.GetGraphDepth(controlFlowGraph2)); Console.WriteLine(controlFlowGraph2.cfg.ToString()); } //Console.WriteLine(r.ToString()); /*Opt2Visitor opt2 = new Opt2Visitor(); * r.Visit(opt2); * * PrettyPrintVisitor ppvis = new PrettyPrintVisitor(); * r.Visit(ppvis); * Console.WriteLine(ppvis.Text); * * Console.WriteLine("\nAssignCountVisitor"); * AssignCountVisitor vis1 = new AssignCountVisitor(); * r.Visit(vis1); * Console.WriteLine(vis1.Count); * * Console.WriteLine("\nStatementCountVisitor"); * StatementCountVisitor vis2 = new StatementCountVisitor(); * r.Visit(vis2); * Console.WriteLine(vis2.Count); * * Console.WriteLine("\nMaxCountExprOpsVisitor"); * MaxCountExprOpsVisitor vis3 = new MaxCountExprOpsVisitor(); * r.Visit(vis3); * Console.WriteLine(vis3.Max); * * Console.WriteLine("\nNestedCyclesVisitor"); * NestedCyclesVisitor vis4 = new NestedCyclesVisitor(); * r.Visit(vis4); * Console.WriteLine(vis4.HasNestedCycles); * * Console.WriteLine("\nCycleNestedToIfVisitor"); * CycleNestedToIfVisitor vis5 = new CycleNestedToIfVisitor(); * r.Visit(vis5); * Console.WriteLine(vis5.HasCycleNestedToIf); * * Console.WriteLine("\nIfNestedToCycleVisitor"); * IfNestedToCycleVisitor vis6 = new IfNestedToCycleVisitor(); * r.Visit(vis6); * Console.WriteLine(vis6.HasIfNestedToCycle); * * Console.WriteLine("\nMaxDepthOfNestedCyclesVisitor"); * MaxDepthOfNestedCyclesVisitor vis7 = new MaxDepthOfNestedCyclesVisitor(); * r.Visit(vis7); * Console.WriteLine(vis7.Max);*/ Console.WriteLine("\nGenerate Three address code"); ThreeAddressCodeVisitor treeCode = new ThreeAddressCodeVisitor(); r.Visit(treeCode); var blocks = new Block(treeCode).GenerateBlocks(); CFG controlFlowGraph = new CFG(blocks); Console.WriteLine("\nГлубина графа:\n" + GraphDepth.GetGraphDepth(controlFlowGraph)); Console.WriteLine(treeCode.ToString()); // выполнение оптимизации для программы, не разбитой на блоки //DeadOrAliveOptimization.DeleteDeadVariables(treeCode.GetCode()); // вычисление множеств Def и Use для всего графа потоков данных /*var DefUse = new DefUseBlocks(controlFlowGraph); * * var InOut = new InOutActiveVariables(DefUse, controlFlowGraph); * * ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph); * * var DefUse = new DefUseBlocks(controlFlowGraph); * * GraphToDOTHelper.SaveAsDOT("C:\\Users\\vladr\\Desktop\\graph.dot", controlFlowGraph); * var InOut = new InOutActiveVariables(DefUse, controlFlowGraph); * * //ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph); * Console.WriteLine("\nafter DeleteDeadVariables for graph\n"); * foreach (var block in controlFlowGraph.blocks) * foreach (var line in block) * Console.WriteLine(line); * * Console.Write("");*/ //DeadOrAliveOptimization. /* SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); * gen.Generate(treeCode.GetCode()); * * gen.PrintCommands(); * Console.WriteLine("\nExecute:"); * gen.Execute(); * * Console.Write("");*/ //DeadOrAliveOptimization. /*CFG cfg = SimpleLang.GenericIterativeAlgorithm.Test * .DeadOrAliveOptimization(controlFlowGraph.blocks); * Console.WriteLine("\nafter DeadOrAliveOptimization\n"); * Console.WriteLine(cfg);*/ /*var constPropOptimizer = new ConstantPropagationOptimizer(); * CFG cfg1 = constPropOptimizer.ApplyOptimization(controlFlowGraph.blocks); * Console.WriteLine("\nafter ConstantPropagationOptimization\n"); * Console.WriteLine(cfg1);*/ //var reachingDefsTest = new ReachingDefsTest(); //reachingDefsTest.IterativeAlgorithm(controlFlowGraph.blocks); //reachingDefsTest.PrintOutput(); //SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); //gen.Generate(treeCode.GetCode()); //gen.PrintCommands(); //Console.WriteLine("\nExecute:"); //gen.Execute(); AutoThreeCodeOptimiser app = new AutoThreeCodeOptimiser(); app.Add(new DistributionOfConstants()); app.Add(new EvalConstExpr()); app.Add(new ApplyAlgebraicIdentities()); var blockws = app.Apply(treeCode); Console.WriteLine(ThreeAddressCodeVisitor.ToString(blockws)); /*CFG cfg = new CFG(blocks); * TransferFunction tf = new TransferFunction(cfg); * Console.WriteLine("\nGen 1"); * foreach (var d in tf.Gen(blocks[0])) * Console.WriteLine(d); * Console.WriteLine("\nGen"); * foreach (var d in tf.Gen(blocks[3])) * Console.WriteLine(d); * Console.WriteLine("\nKill"); * foreach (var d in tf.Kill(blocks[3])) * Console.WriteLine(d); * * Console.WriteLine("\nTransfer function"); * var f = tf.BlockTransferFunction(blocks[3]); * foreach (var d in f(tf.Gen(blocks[0]))) * Console.WriteLine(d); * * var code = treeCode.GetCode(); * app.Apply(code);*/ /*Opt11Visitor opt11vis = new Opt11Visitor(); * ppvis.Text = ""; * r.Visit(opt11vis); * r.Visit(ppvis); * Console.WriteLine(ppvis.Text);*/ /*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);*/ } } catch (FileNotFoundException) { Console.WriteLine("Файл {0} не найден", FileName); } catch (Exception e) { Console.WriteLine("{0}", e); } Console.ReadLine(); }
private void UpdateTab(Modes m, TextBox txt, PictureBox box, Panel panel) { if (FileName.Length == 0) { txt.Text = "File is not set"; return; } try { if (m == Modes.AfterGraph || m == Modes.BeforeGraph) { panel.Visible = true; txt.Visible = false; } else { panel.Visible = false; txt.Visible = true; } string tt = System.IO.File.ReadAllText(FileName); if (m == Modes.Text) { txt.Text = tt; return; } SimpleScanner.Scanner scan = new SimpleScanner.Scanner(); scan.SetSource(tt, 0); SimpleParser.Parser pars = new SimpleParser.Parser(scan); var b = pars.Parse(); if (!b) { txt.Text = "Ошибка парсинга"; return; } var r = pars.root; SimpleLang.Visitors.FillParentVisitor parVisitor = new SimpleLang.Visitors.FillParentVisitor(); r.Visit(parVisitor); SimpleLang.Visitors.ThreeAddressCodeVisitor threeCodeVisitor = new SimpleLang.Visitors.ThreeAddressCodeVisitor(); r.Visit(threeCodeVisitor); if (m == Modes.BeforeThreeCode) { txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(threeCodeVisitor.GetCode()); Console.WriteLine(txt.Text); return; } if (m == Modes.BeforeRun) { SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); gen.Generate(threeCodeVisitor.GetCode()); List <long> datas = new List <long>(); List <long> datas2 = new List <long>(); int count_run = Int32.Parse(textBox3.Text); string res = ""; for (int i = 0; i < count_run; i++) { var timer = System.Diagnostics.Stopwatch.StartNew(); res = gen.Execute(); timer.Stop(); datas.Add(timer.ElapsedMilliseconds); datas2.Add(timer.ElapsedTicks); } res = res + Environment.NewLine + Environment.NewLine + "Executed avg: " + (datas.Min()).ToString() + " ms" + " or " + (datas2.Min()).ToString() + " ticks" + Environment.NewLine; for (int i = 0; i < datas.Count; i++) { res = res + i.ToString() + ": " + datas[i].ToString() + " ms or " + datas2[i].ToString() + " ticks" + Environment.NewLine; } txt.Text = res; return; } if (m == Modes.BeforeBlocks) { var blocks = new SimpleLang.Block.Block(threeCodeVisitor).GenerateBlocks(); txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(blocks); return; } if (m == Modes.BeforeMass) { var blocks = new SimpleLang.Block.Block(threeCodeVisitor).GenerateBlocks(); DrawMass(blocks, txt); return; } if (m == Modes.BeforeGraph) { var blocks = new SimpleLang.Block.Block(threeCodeVisitor).GenerateBlocks(); SimpleLang.ControlFlowGraph.ControlFlowGraph gra = new SimpleLang.ControlFlowGraph.ControlFlowGraph(blocks); DrawCFG(box, gra.cfg, blocks, panel); return; } SimpleLang.Visitors.AutoApplyVisitor optAst = GetASTOptimizer(); optAst.Apply(r); if (m == Modes.ASTOpt) { SimpleLang.Visitors.PrettyPrintVisitor vis = new SimpleLang.Visitors.PrettyPrintVisitor(); r.Visit(vis); txt.Text = vis.Text; return; } threeCodeVisitor = new SimpleLang.Visitors.ThreeAddressCodeVisitor(); r.Visit(threeCodeVisitor); var opt = GetOptimiser(); var outcode = opt.Apply(threeCodeVisitor); if (m == Modes.AfterMass) { DrawMass(outcode, txt); return; } if (m == Modes.AfterBlocks) { txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(outcode); return; } if (m == Modes.AfterGraph) { SimpleLang.ControlFlowGraph.ControlFlowGraph gra = new SimpleLang.ControlFlowGraph.ControlFlowGraph(outcode); DrawCFG(box, gra.cfg, outcode, panel); return; } if (m == Modes.AfterTbreeCode) { System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode> res = new System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode>(); foreach (var block in outcode) { foreach (SimpleLang.Visitors.ThreeCode code in block) { res.AddLast(code); } } txt.Text = SimpleLang.Visitors.ThreeAddressCodeVisitor.ToString(res); Console.WriteLine(txt.Text); return; } if (m == Modes.AfterRun) { System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode> res = new System.Collections.Generic.LinkedList <SimpleLang.Visitors.ThreeCode>(); foreach (var block in outcode) { foreach (SimpleLang.Visitors.ThreeCode code in block) { res.AddLast(code); } } SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); gen.Generate(res); List <long> datas = new List <long>(); List <long> datas2 = new List <long>(); int count_run = Int32.Parse(textBox3.Text); string re2 = ""; for (int i = 0; i < count_run; i++) { var timer = System.Diagnostics.Stopwatch.StartNew(); re2 = gen.Execute(); timer.Stop(); datas.Add(timer.ElapsedMilliseconds); datas2.Add(timer.ElapsedTicks); } re2 = re2 + Environment.NewLine + Environment.NewLine + "Executed avg: " + (datas.Min()).ToString() + " ms" + " or " + (datas2.Min()).ToString() + " ticks" + Environment.NewLine; for (int i = 0; i < datas.Count; i++) { re2 = re2 + i.ToString() + ": " + datas[i].ToString() + " ms or " + datas2[i].ToString() + " ticks" + Environment.NewLine; } txt.Text = re2; return; } txt.Text = "Is not implemented"; } catch (Exception e) { panel.Visible = false; txt.Visible = true; txt.Text = e.ToString(); } }