예제 #1
0
        private static string BuildDotGraph(ControlFlowGraph cfg)
        {
            var sb = new StringBuilder();

            sb.AppendLine("digraph CFG {");
            sb.AppendLine("node[shape = record];\n");
            sb.AppendLine("graph [splines=ortho, nodesep=1, overlap=false];");
            foreach (var node in cfg.CFGNodes)
            {
                string name = GetNameForGuid(node.BlockId);

                // <ИМЯ_УЗЛА> [label = "<TEXT>\l<TEXT>"]
                sb.Append($"{name}  [label = \"");
                foreach (var cmd in node.CodeList)
                {
                    string cmdText = OutputSanitizer.Sanitize(cmd.ToString(), OutputSanitizer.SanitizeLevel.DotFile);
                    sb.Append(cmdText + @"\l");
                }

                sb.AppendLine("\"]");
            }

            sb.AppendLine("\n");

            // генерируем дуги
            foreach (var node in cfg.CFGNodes)
            {
                string name = GetNameForGuid(node.BlockId);
                // строим по потомкам
                foreach (var c in node.Children)
                {
                    string cName = GetNameForGuid(c.BlockId);
                    sb.AppendLine($"{name} -> {cName};");
                }
            }

            sb.AppendLine("}");

            return(sb.ToString());
        }
        private void PostProcess(TACode code)
        {
            string postProcessCode = OutputSanitizer.Sanitize(code.ToString(), OutputSanitizer.SanitizeLevel.TextBox);

            PrintableCodeGenerated(null, postProcessCode);
        }