diff --git a/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java b/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java index e0a970f..4b7f3c0 100644 --- a/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java +++ b/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java @@ -116,8 +116,8 @@ public final class DataFlowGraph implements Iterable { .append("}\"];\n"); } - dot.append("START[label=\"START\"];\n") - .append("END[label=\"END\"];\n"); + dot.append("START[label=\"START\" shape=box];\n") + .append("END[label=\"END\" shape=box];\n"); dot.append("START -> \"").append(this.dataFlowNodes.get(0).getId()).append("\";\n"); dot.append("\"").append(this.dataFlowNodes.get(this.dataFlowNodes.size() - 1).getId()).append("\" -> END;\n"); @@ -129,6 +129,16 @@ public final class DataFlowGraph implements Iterable { } } + for (DataFlowNode node : this.dataFlowNodes) { + dot.append("{ rank=same; "); + for (DataFlowNode successor : node.getSuccessorSet()) { + + dot.append("\"").append(successor.getId()).append("\", "); + } + dot.deleteCharAt(dot.lastIndexOf(",")); + dot.append("}\n"); + } + dot.append("}"); GraphvizCaller.callGraphviz(dot, "DataFlowGraph"); diff --git a/src/main/java/codegen/flowgraph/FlowGraph.java b/src/main/java/codegen/flowgraph/FlowGraph.java index 45970d9..8632f3d 100644 --- a/src/main/java/codegen/flowgraph/FlowGraph.java +++ b/src/main/java/codegen/flowgraph/FlowGraph.java @@ -204,10 +204,6 @@ public class FlowGraph implements Iterable { public String printToImage() { final Optional currentBlock = this.getCurrentBlock(); - if (this.basicBlocks.isEmpty() || currentBlock.isEmpty()) { - return "Can't export empty graph: FlowGraph.svg"; - } - final StringBuilder dot = new StringBuilder(); dot.append("digraph dfd {\n") @@ -225,18 +221,36 @@ public class FlowGraph implements Iterable { .append("}\"];\n"); } - dot.append("START[label=\"START\"];\n") - .append("END[label=\"END\"];\n"); + dot.append("START[label=\"START\" shape=box];\n") + .append("END[label=\"END\" shape=box];\n"); - dot.append("START -> \"").append(this.basicBlocks.get(0).getId()).append("\";\n"); - dot.append("\"").append(currentBlock.get().getId()).append("\" -> END;\n"); - for (FlowBasicBlock block : this.basicBlocks) { - // Successors + if (!this.basicBlocks.isEmpty() && currentBlock.isPresent()) { - for (FlowBasicBlock successor : block.getBlockSuccessorSet()) { - dot.append("\"").append(block.getId()).append("\" -> \"").append(successor.getId()).append("\";\n"); + dot.append("START -> \"").append(this.basicBlocks.get(0).getId()).append("\";\n"); + dot.append("\"").append(currentBlock.get().getId()).append("\" -> END;\n"); + + for (FlowBasicBlock block : this.basicBlocks) { + // Successors + + for (FlowBasicBlock successor : block.getBlockSuccessorSet()) { + dot.append("\"").append(block.getId()).append("\" -> \"").append(successor.getId()).append("\";\n"); + } } + + for (FlowBasicBlock block : this.basicBlocks) { + dot.append("{ rank=same; "); + for (FlowBasicBlock successor : block.getBlockSuccessorSet()) { + + dot.append("\"").append(successor.getId()).append("\", "); + } + dot.deleteCharAt(dot.lastIndexOf(",")); + dot.append("}\n"); + } + } else { + // Main-method is empty + + dot.append("START -> END"); } dot.append("}"); diff --git a/src/main/java/parser/ast/SyntaxTree.java b/src/main/java/parser/ast/SyntaxTree.java index e53560d..097809a 100644 --- a/src/main/java/parser/ast/SyntaxTree.java +++ b/src/main/java/parser/ast/SyntaxTree.java @@ -67,9 +67,15 @@ public class SyntaxTree { dot.append("\"").append(current.getId()).append("\"") .append(" [label=\"{ ") - .append(current.getName()) + .append(current.getName() + .replace("\"", "\\\"") + .replace("<", "less") + .replace(">", "greater")) .append("| ") - .append(current.getValue()) + .append(current.getValue() + .replace("\"", "\\\"") + .replace("<", "less") + .replace(">", "greater")) .append("}\"];\n"); current.getChildren().forEach(stack::push);