ignalxy 4 vuotta sitten
vanhempi
commit
b2aaf9ff65
27 muutettua tiedostoa jossa 651 lisäystä ja 905 poistoa
  1. 1 1
      .gitignore
  2. 29 0
      .idea/artifacts/java9_flowchart_jar.xml
  3. 1 1
      .idea/compiler.xml
  4. 5 0
      .idea/misc.xml
  5. 44 47
      docs/java9-flowchart.md
  6. 28 0
      example/java/Person.java
  7. 11 0
      example/java/Test.java
  8. 5 0
      flowchart/pom.xml
  9. 89 0
      flowchart/src/main/java/xyz/ignatz/flowchart/Block.java
  10. 58 0
      flowchart/src/main/java/xyz/ignatz/flowchart/Factory.java
  11. 26 27
      flowchart/src/main/java/xyz/ignatz/flowchart/Flowchart.java
  12. 40 0
      flowchart/src/main/java/xyz/ignatz/flowchart/Node.java
  13. 0 67
      flowchart/src/main/java/xyz/ignatz/flowchart/module/Block.java
  14. 0 44
      flowchart/src/main/java/xyz/ignatz/flowchart/module/Factory.java
  15. 0 8
      flowchart/src/main/java/xyz/ignatz/flowchart/module/INode.java
  16. 0 35
      flowchart/src/main/java/xyz/ignatz/flowchart/module/Node.java
  17. 8 4
      java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/Java9FlowchartGenerator.java
  18. 23 0
      java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/recognizer/Java9ContextClassifier.java
  19. 42 78
      java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/recognizer/Java9FlowchartVisitor.java
  20. 22 14
      java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/utils/Blocks.java
  21. 3 0
      java9-flowchart/src/main/resources/META-INF/MANIFEST.MF
  22. BIN
      output/flowchart/Person#main.png
  23. 178 572
      output/flowchart/Person#main.svg
  24. 1 6
      pom.xml
  25. 1 1
      util/pom.xml
  26. 1 0
      util/src/main/java/xyz/ignatz/antlr4/Utils.java
  27. 35 0
      util/src/main/java/xyz/ignatz/utils/Pair.java

+ 1 - 1
.gitignore

@@ -2,4 +2,4 @@
 /java9-flowchart/target/
 /flowchart/target/
 /map-to-json/target/
-/antlr4-utils/target/
+/utils/target/

+ 29 - 0
.idea/artifacts/java9_flowchart_jar.xml

@@ -0,0 +1,29 @@
+<component name="ArtifactManager">
+  <artifact type="jar" name="java9-flowchart:jar">
+    <output-path>$PROJECT_DIR$/out/artifacts/java9_flowchart_jar</output-path>
+    <root id="archive" name="java9-flowchart.jar">
+      <element id="module-output" name="java9-flowchart" />
+      <element id="module-output" name="flowchart" />
+      <element id="module-output" name="util" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/ibm/icu/icu4j/61.1/icu4j-61.1.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/guru/nidi/graphviz-java/0.18.1/graphviz-java-0.18.1.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/guru/nidi/com/kitfox/svgSalamander/1.1.3/svgSalamander-1.1.3.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/webjars/npm/viz.js-graphviz-java/2.1.3/viz.js-graphviz-java-2.1.3.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/antlr/antlr4/4.9.2/antlr4-4.9.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/jcl-over-slf4j/1.7.30/jcl-over-slf4j-1.7.30.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/abego/treelayout/org.abego.treelayout.core/1.0.3/org.abego.treelayout.core-1.0.3.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/antlr/antlr4-runtime/4.9.2/antlr4-runtime-4.9.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/antlr/ST4/4.3/ST4-4.3.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/guru/nidi/com/eclipsesource/j2v8/j2v8_win32_x86_64/4.6.0/j2v8_win32_x86_64-4.6.0.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/glassfish/javax.json/1.0.4/javax.json-1.0.4.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/net/arnx/nashorn-promise/0.1.1/nashorn-promise-0.1.1.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-nop/1.7.30/slf4j-nop-1.7.30.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-lang/commons-lang/2.6/commons-lang-2.6.jar" path-in-jar="/" />
+    </root>
+  </artifact>
+</component>

+ 1 - 1
.idea/compiler.xml

@@ -10,8 +10,8 @@
         <module name="map-to-json" />
         <module name="flowchart" />
         <module name="aidl-to-json" />
+        <module name="util" />
         <module name="java-flowchart" />
-        <module name="antlr4-utils" />
       </profile>
     </annotationProcessing>
     <bytecodeTargetLevel>

+ 5 - 0
.idea/misc.xml

@@ -33,6 +33,11 @@
         <option value="$PROJECT_DIR$/pom.xml" />
       </list>
     </option>
+    <option name="ignoredFiles">
+      <set>
+        <option value="$PROJECT_DIR$/utils/pom.xml" />
+      </set>
+    </option>
   </component>
   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8 201" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />

+ 44 - 47
docs/java9-flowchart.md

@@ -6,61 +6,58 @@
 
 使用ANTLR4生成语法分析树,编写Visitor获得流程图结构,使用graphviz-java绘制流程图。
 
+仅支持普通的`if`,`switch`,`for`,`while`,`do while`结构。
+
 ## 结构
 
 - java9-flowchart
   此部分负责将java9程序转化为流程图。
-  - java 
-    - <big>`Java9FlowchartGenerator`</big>
-    
-      程序主体,输入文件名和输出路径,输出图片。程序整体结构如下:
-      1. 调用ANTLR4将Java9程序转换为语法树;
-      2. 使用`Java9FlowchartVisitor`遍历语法树,建图;
-      3. `Flowchart`将图翻译为`graphviz-java`需要的形式;
-      4. 绘制对应的流程图。
-  
-    - recognizer:此部分负责分析Java语法。
-  
-      - ANTLR4根据Java9.g4生成的基本分析器。
+
+  - `Java9FlowchartGenerator`
   
-      - <big>`Java9FlowchartVisitor`</big>负责处理`Block`的连接。
-        
-        继承自`Java9BaseVisitor<Block>`,即visit函数返回`Block`,`Block`维护一个子图。我们需要对每条规则设计正确的`Block`生成方式。规则分类如下(未列出的规则默认返回`defaultResult() -> null`):
-        1. 原子单位:直接返回`Block`,不再向下递归,有`localVariableDeclaration`, `statementExpressionList`, `emptyStatement`, `expressionStatement`, `assertStatement`, `breakStatement`, `continueStatement`, `returnStatement`;
-        2. 顺序结构:顺序结构的出现可能很多,但我们只需要重载`aggregateResult(aggregate, next)`函数为以顺序结构的方式连接两个Block即可;
-        3. 分支结构:含`if`或`switch`的规则。需要使用正确的方式连接一个判断Block和一或多个分支Block;
-        4. 循环结构:含`for`或`while`的规则。在分支结构的基础上,再增加一条边形成循环即可。 
+    程序主体,输入文件名和输出路径,输出图片。程序整体结构如下:
+    1. 调用ANTLR4将Java9程序转换为语法树;
+    2. 使用`Java9FlowchartVisitor`遍历语法树,每个方法构造一个流程图`Flowchart`;
+    3. `Flowchart`生成graphviz-java的`Graph`;
+    4. 生成对应的流程图。
 
-    - `Blocks`
-      提供更多构造`Block`的工厂方法。
-      用于精简`Java9FlowchartVisitor`中重复代码。
-    
-    - `JavaName`
-      用于维护当前访问位置所在`class`/`method`。
+  - recognizer:此部分负责分析Java语法。
+
+    - ANTLR4根据Java9.g4生成的基本分析器。
+      
+    - `Java9FlowchartVisitor`
+      - 负责:
+        1. 记录每个方法的名字,并分别构造流程图`Flowchart`;
+        2. 调用`Blocks`中的方法转换不同的`Context`为子图`Block`,规则分类如下:
+           1. 原子单位:作为一个节点`Node`,有`localVariableDeclaration`, `statementExpressionList`, `emptyStatement`, `expressionStatement`, `assertStatement`, `breakStatement`, `continueStatement`, `returnStatement`;
+           2. 顺序结构:重载`aggregateResult(aggregate, next)`函数为顺序连接两个`Block`;
+           3. 分支结构:含`if`或`switch`的规则;
+           4. 循环结构:含`for`或`while`的规则。
+           5. 命名语句:指影响当前方法名的语句,包括`class`,`interface`及`method`声明语句。
+
+  - `Blocks`
+    负责构造`Block`以及处理顺序、分支、循环的`Block`的连接。
   
-  - resource
-    - grammar 
-      存放Java9.g4
+  - `JavaName`
+    用于维护当前访问位置所在`class`/`method`。
 
 - flowchart
+ 
   此部分为存储流程图的数据结构
-  - java
-      - `Node`
-        
-        - 代表流程图的一个节点,成员有:
-          - `label` 节点的标签;
-          - `line` 行号;
-          - `Map<String, Node> links`存储转移边。
-            - **仅允许在构造时定义出边,默认指向`null`,称为空边。**
-            - **后续仅允许设置空边的指向。**
-            - **仅允许`Block`操作,对`Java9FlowchartVisitor`透明。**
+  - `Node`
+    - 代表流程图的一个节点,成员有:
+      - `label` 节点的标签;
+      - `line` 行号;
+      - `Map<String, Node> links` 边表。
+        - 构造时定义出边,可以为空边指向`null`。
+  - `Block`
+    - 代表一个子流程图,负责实现块连接的基本操作,成员有:
+      - `start` 入口节点;
+      - `Map<String, NullLink> nullLinks` 分类空边表;
+      - `NullLink`为单向环链,确保修改分类时的时间复杂度;
+      - `move`方法用于修改空边分类。
+  - `Factory`包含`Block`的工厂函数。
+  - `Flowchart`负责通过`Block`建graphviz-java的`Graph`。
+
+## 代码
 
-      - <big>`Block`</big>
-      
-        - 代表一个子流程图,负责实现块连接的基本操作,成员有:
-          - `start` 入口节点;
-          - `nullLinks` 空边表,空边有分类,分类不固定,可修改,初始为边的标记。
-        
-        - 块连接
-          - 为了保证效率,每次块连接从空边表中查找边,设置完后删去;
-          - 另外还有修改边分类的操作`modifyLinkType`。

+ 28 - 0
example/java/Person.java

@@ -0,0 +1,28 @@
+class Person{
+    public static void main(String[] args){
+        int age = 10;
+        if(age>10){
+            System.out.println("年龄太大");
+        }
+        else if(age>20){
+            System.out.println("123");
+        }
+        else{
+            age = 18;
+        }
+        for(int i =0;i<12;i++){
+            age = 19;
+            System.out.println("234");
+            System.out.println("456");
+        }
+        char i = 'a';
+        switch(i) {
+            case 'a':
+                System.out.println("123");
+                break;
+            case 'b':
+                System.out.println("456");
+                break;
+        }
+    }
+}

+ 11 - 0
example/java/Test.java

@@ -1,4 +1,15 @@
 class Person{
+
+	String name;
+	public String name() {
+		class Test {
+			static void test() {
+				System.out.print("test");
+			}
+		}
+		Test.test();
+		return "name: " + name;
+	}
 	public static void main(String[] args){
 		int age = 10;
 		if(age>10){

+ 5 - 0
flowchart/pom.xml

@@ -26,6 +26,11 @@
             <artifactId>commons-lang</artifactId>
             <version>2.6</version>
         </dependency>
+        <dependency>
+            <groupId>xyz.ignatz</groupId>
+            <artifactId>util</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
     <properties>

+ 89 - 0
flowchart/src/main/java/xyz/ignatz/flowchart/Block.java

@@ -0,0 +1,89 @@
+package xyz.ignatz.flowchart;
+
+import java.util.*;
+
+public class Block {
+
+    class NullLink {
+        Node from;
+        String label;
+        NullLink next;
+
+        public NullLink(Node from, String label) {
+            this.from = from;
+            this.label = label;
+            this.next = this;
+        }
+    }
+
+    static NullLink concat(NullLink a, NullLink b) {
+        if (a == null) return b;
+        if (b == null) return a;
+        NullLink c = a.next;
+        a.next = b.next;
+        b.next = c;
+        return a;
+    }
+
+    Node start;
+    Map<String, NullLink> nullLinks = new HashMap<>();
+
+    protected Block(Node node) {
+        start = node;
+        node.links.forEach((label, to) -> {
+            if (to == null) nullLinks.put(label, new NullLink(node, label));
+        });
+    }
+
+    public Node start() {
+        return start;
+    }
+
+    public Block link(Block next) {
+        return link(next,"");
+    }
+
+    public Block link(Block next, String type) {
+        return next == null ? this : link(next.start, type).merge(next);
+    }
+
+    public Block move(String old, String type) {
+        Objects.requireNonNull(old);
+        Objects.requireNonNull(type);
+        if (type.equals(old)) return this;
+        nullLinks.put(type, concat(nullLinks.get(type), nullLinks.remove(old)));
+        return this;
+    }
+
+    public List<Node> nodes() {
+        Set<Node> set = new HashSet<>();
+        Queue<Node> queue = new LinkedList<>();
+        queue.add(start);
+        set.add(start);
+        while (!queue.isEmpty()) {
+            Node n = queue.poll();
+            if (n == null) continue;
+            Set<Node> ns = new HashSet<>(n.links.values());
+            ns.removeAll(set);
+            queue.addAll(ns);
+            set.addAll(ns);
+        }
+        set.remove(null);
+        return new ArrayList<>(set);
+    }
+
+    protected Block link(Node to, String type) {
+        NullLink nullLink = nullLinks.remove(type);
+        if (nullLink == null) return this;
+        NullLink i = nullLink.next;
+        nullLink.next = null;
+        for (; i != null; i = i.next) i.from.link(to, i.label);
+        return this;
+    }
+
+    protected Block merge(Block other) {
+        other.nullLinks.forEach((type, links) -> nullLinks.merge(type, links, (old, value) -> concat(old, value)));
+        other.nullLinks = nullLinks;
+        return this;
+    }
+}

+ 58 - 0
flowchart/src/main/java/xyz/ignatz/flowchart/Factory.java

@@ -0,0 +1,58 @@
+package xyz.ignatz.flowchart;
+
+
+
+import xyz.ignatz.utils.Pair;
+
+import java.util.*;
+
+public class Factory {
+    public static Flowchart flowchart(String name, Block block) {
+        return new Flowchart(name, block);
+    }
+
+    public static Block block(String dsc, Integer line) {
+        return block(dsc, line, "");
+    }
+
+    public static Block block(String dsc, Integer line, String label) {
+        return block(dsc, line, Arrays.asList(label));
+    }
+
+    public static Block block(String dsc, Integer line, Collection<String> labels) {
+        Map<String, Node> links = new HashMap<>();
+        labels.forEach(label -> links.put(label, null));
+        return block(dsc, line, links);
+    }
+
+    public static Block block(String dsc, Integer line, Map<String, Node> links) {
+        return new Block(new Node(dsc, line, links));
+    }
+
+    static public Block block(Block block, Block next) {
+        return block == null ? next : block.link(next);
+    }
+
+    static public Block loop(Block judge, Block block, boolean judgeFirst) {
+        ifBlock(judge, block.link(judge.start, "").link(judge.start, "continue")).move("break", "");
+        return judgeFirst ? judge : block;
+    }
+
+    static public Block ifBlock(Block judge, Block bTrue) {
+        return judge.link(bTrue, "true").move("false", "");
+    }
+
+    static public Block ifBlock(Block judge, Block bTrue, Block bFalse) {
+        return judge.link(bTrue, "true").link(bFalse, "false");
+    }
+
+    static public Block switchBlock(String expr, Integer line, List<Pair<Block, List<String>>> blocks) {
+        Map<String, Node> map = new HashMap<>();
+        Block block = null;
+        for (Pair<Block, List<String>> p : blocks) {
+            p.snd.forEach(label -> map.put(label, p.fst.start));
+            block = block(block, p.fst);
+        }
+        return block("switch (" + expr + ")", line, map).link(block).move("break", "");
+    }
+}

+ 26 - 27
flowchart/src/main/java/xyz/ignatz/flowchart/Flowchart.java

@@ -5,45 +5,44 @@ import java.util.*;
 import guru.nidi.graphviz.attribute.*;
 import guru.nidi.graphviz.model.Graph;
 import guru.nidi.graphviz.model.MutableNode;
-import xyz.ignatz.flowchart.module.Block;
-import xyz.ignatz.flowchart.module.INode;
 
 import static guru.nidi.graphviz.model.Factory.*;
 
 
 public class Flowchart {
-    Graph g;
-    public Flowchart(String name, Block block) {
-        Queue<INode> queue = new LinkedList<>();
-        Map<INode, MutableNode> map = new HashMap<>();
+    String name;
+    Node start;
+    List<Node> nodes;
+
+    protected Flowchart(String name, Block block) {
+        this.name = name;
+        start = block.start();
+        nodes = block.nodes();
+    }
+
+    public Graph toGraph() {
+        Map<Node, MutableNode> map = new HashMap<>();
         map.put(null, mutNode("END").add(Shape.BOX, Style.ROUNDED));
-        queue.add(block.getStart());
-        while (!queue.isEmpty()) {
-            INode n = queue.poll();
-            if (n == null) continue;
-            map.put(n, mutNode(Label.html(n.html())));
-            Collection<INode> ns = n.links().values();
-            ns.removeAll(map.keySet());
-            queue.addAll(ns);
-        }
+        nodes.forEach(i -> map.put(i, mutNode(i.label())));
         map.forEach((i, n) -> {
             if (i == null) return;
-            Map<String, INode> tps = i.links();
-            n.add(tps.size() > 1 ? Shape.DIAMOND : Shape.BOX);
-            tps.forEach((dsc, dst) -> n.addLink(to(map.get(dst)).with(Label.of(dsc))));
+            Map<Label, Node> links = i.links();
+            n.add(links.size() > 1 ? Shape.DIAMOND : Shape.BOX);
+            links.forEach((label, to) -> {
+                Objects.requireNonNull(label);
+                Objects.requireNonNull(map.get(to));
+                n.addLink(to(map.get(to)).with(label));
+            });
         });
-        map.get(block.getStart()).add(Shape.BOX, Style.ROUNDED);
-        g = mutGraph(name).setDirected(true)
+        map.get(start).add(Shape.BOX, Style.ROUNDED);
+        return mutGraph(name).setDirected(true)
                 .graphAttrs().add(Rank.dir(Rank.RankDir.TOP_TO_BOTTOM))
-                .graphAttrs().add(Font.config("Arial", 10))  // TODO: does not work
+                /* TODO: graph set font does not work */
+                .graphAttrs().add(Font.config("Arial", 10))
                 .add(new ArrayList<>(map.values())).toImmutable();
     }
 
-    public Graph graph() {
-        return g;
-    }
-
-    public String getName() {
-        return g.name().value();
+    public String name() {
+        return name;
     }
 }

+ 40 - 0
flowchart/src/main/java/xyz/ignatz/flowchart/Node.java

@@ -0,0 +1,40 @@
+package xyz.ignatz.flowchart;
+
+import guru.nidi.graphviz.attribute.Label;
+import org.apache.commons.lang.StringEscapeUtils;
+
+import java.util.*;
+
+public class Node {
+    String label;
+    Integer line;
+    Map<String, Node> links;
+
+    protected Node(String label, Integer line, Map<String, Node> links) {
+        links.remove(null);
+        this.label = label;
+        this.line = line;
+        this.links = links;
+    }
+
+    protected boolean link(Node to, String label) {
+        Objects.requireNonNull(label);
+        if (links.containsKey(label) && links.get(label) == null) {
+            links.put(label, to);
+            return true;
+        }
+        return false;
+    }
+
+    public Label label() {
+        return Label.html(StringEscapeUtils.escapeHtml(label)
+                + "<i><font color=\"gray\">  " + line.toString() +"</font></i>");
+    }
+
+    public Map<Label, Node> links() {
+        assert !links.containsKey(null) : "null edge exists";
+        return new HashMap<Label, Node>(){{ links.forEach((label, to) -> put(Label.of(label), to)); }};
+    }
+
+    // Todo: link public
+}

+ 0 - 67
flowchart/src/main/java/xyz/ignatz/flowchart/module/Block.java

@@ -1,67 +0,0 @@
-package xyz.ignatz.flowchart.module;
-
-
-import java.util.*;
-
-public class Block {
-
-    class Link {
-        Node from;
-        String label;
-        public Link(Node from, String label) {
-            this.from = from;
-            this.label = label;
-        }
-    }
-
-    Node start;
-    Map<String, HashSet<Link>> nullLinks = new HashMap<>();
-
-    public Block(Node node) {
-        start = node;
-        node.links.forEach((label, to) -> {
-            if (to == null) {
-                nullLinks.putIfAbsent(label, new HashSet<>());
-                nullLinks.get(label).add(new Link(node, label));
-            }
-        });
-    }
-
-    public Node getStart() {
-        return start;
-    }
-
-    public Block link(Block next) {
-        return link(next,"");
-    }
-
-    public Block link(Block next, String type) {
-        return next == null ? this : link(next.start, type).merge(next);
-    }
-
-    public Block modifyLinkType(String old, String type) {
-        Objects.requireNonNull(old);
-        Objects.requireNonNull(type);
-        if (type.equals(old) || !nullLinks.containsKey(old)) return this;
-        nullLinks.putIfAbsent(type, new HashSet<>());
-        nullLinks.get(type).addAll(nullLinks.remove(old));
-        return this;
-    }
-
-    Block link(Node to, String type) {
-        Set<Link> links = nullLinks.remove(type);
-        if (links != null)
-            links.forEach(link -> link.from.link(to, link.label));
-        return this;
-    }
-
-    Block merge(Block other) {
-        other.nullLinks.forEach((type, links) ->
-                nullLinks.merge(type, links, (old, value) -> {
-                    old.addAll(value);
-                    return old;
-                }));
-        other.nullLinks = nullLinks;
-        return this;
-    }
-}

+ 0 - 44
flowchart/src/main/java/xyz/ignatz/flowchart/module/Factory.java

@@ -1,44 +0,0 @@
-package xyz.ignatz.flowchart.module;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Factory {
-    public static Block block(String dsc, Integer line) {
-        return block(dsc, line, "");
-    }
-
-    public static Block block(String dsc, Integer line, String label) {
-        return block(dsc, line, Arrays.asList(label));
-    }
-
-    public static Block block(String dsc, Integer line, Collection<String> labels) {
-        Map<String, Node> links = new HashMap<>();
-        labels.forEach(label -> links.put(label, null));
-        return block(dsc, line, links);
-    }
-
-    public static Block block(String dsc, Integer line, Map<String, Node> links) {
-        return new Block(new Node(dsc, line, links));
-    }
-
-    static public Block link(Block block, Block next) {
-        return block == null ? next : block.link(next);
-    }
-
-    static public Block loop(Block judge, Block block, boolean judgeFirst) {
-        block.link(judge.start, "").link(judge.start, "continue");
-        ifThen(judge, block).modifyLinkType("break", "");
-        return judgeFirst ? judge : block;
-    }
-
-    static public Block ifThen(Block judge, Block bTrue) {
-        return judge.link(bTrue, "true").modifyLinkType("false", "");
-    }
-
-    static public Block ifThenElse(Block judge, Block bTrue, Block bFalse) {
-        return judge.link(bTrue, "true").link(bFalse, "false");
-    }
-}

+ 0 - 8
flowchart/src/main/java/xyz/ignatz/flowchart/module/INode.java

@@ -1,8 +0,0 @@
-package xyz.ignatz.flowchart.module;
-
-import java.util.Map;
-
-public interface INode {
-    String html();
-    Map<String, INode> links();
-}

+ 0 - 35
flowchart/src/main/java/xyz/ignatz/flowchart/module/Node.java

@@ -1,35 +0,0 @@
-package xyz.ignatz.flowchart.module;
-
-import org.apache.commons.lang.StringEscapeUtils;
-
-import java.util.*;
-
-public class Node implements INode {
-    String label;
-    Integer line;
-    Map<String, Node> links;
-
-    public Node(String label, Integer line, Map<String, Node> links) {
-        links.remove(null);
-        this.label = label;
-        this.line = line;
-        this.links = links;
-    }
-
-    boolean link(Node to, String label) {
-        Objects.requireNonNull(label);
-        if (links.containsKey(label) && links.get(label) == null) {
-            links.put(label, to);
-            return true;
-        }
-        return false;
-    }
-
-    public String html() {
-        return StringEscapeUtils.escapeHtml(label) + "<i><font color=\"gray\">  " + line.toString() +"</font></i>";
-    }
-
-    public Map<String, INode> links() {
-        return new HashMap<>(links);
-    }
-}

+ 8 - 4
java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/Java9FlowchartGenerator.java

@@ -18,6 +18,7 @@ import java.util.List;
 
 public class Java9FlowchartGenerator {
     public static void main(String[] args) {
+        // Java9FlowchartGenerator example/java/Test.java output/flowchart
         if (args.length < 2) {
             System.out.println("JavaControlFlowGenerator input_filename output_directory");
             return;
@@ -30,23 +31,26 @@ public class Java9FlowchartGenerator {
         } catch (IOException e) {
             e.printStackTrace();
         }
+
         String[] lines = input.toString().split("\n|\r\n|\n\r");
         for (int i=0; i<lines.length; ++i) {
             Formatter formatter = new Formatter();
-            System.out.println(formatter.format("%4d. %s\n", i+1, lines[i]));
+            System.out.println(formatter.format("%4d. %s", i+1, lines[i]));
         }
+
         Java9Lexer lexer = new Java9Lexer(input);
         CommonTokenStream tokens = new CommonTokenStream(lexer);
         Java9Parser parser = new Java9Parser(tokens);
         ParseTree tree = parser.compilationUnit();
         Java9FlowchartVisitor visitor = new Java9FlowchartVisitor();
         visitor.visit(tree);
-        List<Flowchart> flowcharts = visitor.getFlowcharts();
+        List<Flowchart> flowcharts = visitor.flowcharts();
         for (Flowchart flowchart : flowcharts) {
-            String outputFileName = outputDirectory + '/' + flowchart.getName();
+            String outputFileName = outputDirectory + '/' + flowchart.name();
+            System.out.println(outputFileName);
             File file = new File(outputFileName);
             try {
-                Graphviz.fromGraph(flowchart.graph()).render(Format.SVG).toFile(file);
+                Graphviz.fromGraph(flowchart.toGraph()).render(Format.SVG).toFile(file);
             } catch (IOException e) {
                 System.err.println("[ERROR] Output " + outputFileName + " error.");
                 e.printStackTrace();

+ 23 - 0
java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/recognizer/Java9ContextClassifier.java

@@ -0,0 +1,23 @@
+package xyz.ignatz.antlr4.java9.recognizer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Java9ContextClassifier {
+    static final Map<Class, String> map = new HashMap<Class, String>(){{
+        put(Java9Parser.LocalVariableDeclarationContext.class, "atom");
+        put(Java9Parser.StatementExpressionListContext.class, "atom");
+        put(Java9Parser.EmptyStatementContext.class, "atom");
+        put(Java9Parser.ExpressionStatementContext.class, "atom");
+        put(Java9Parser.NormalClassDeclarationContext.class, "name");
+        put(Java9Parser.NormalInterfaceDeclarationContext.class, "name");
+        put(Java9Parser.AnnotationTypeDeclarationContext.class, "name");
+    }};
+
+    public static String type(Object o) {
+        for (Map.Entry<Class, String> entry : map.entrySet())
+            if (entry.getKey().isInstance(o))
+                return entry.getValue();
+        return null;
+    }
+}

+ 42 - 78
java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/recognizer/Java9FlowchartVisitor.java

@@ -1,12 +1,14 @@
 package xyz.ignatz.antlr4.java9.recognizer;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.RuleNode;
 import xyz.ignatz.antlr4.java9.utils.JavaName;
 import xyz.ignatz.flowchart.Flowchart;
-import xyz.ignatz.flowchart.module.Block;
-import xyz.ignatz.flowchart.module.Factory;
-import xyz.ignatz.flowchart.module.Node;
+import xyz.ignatz.flowchart.Block;
+import xyz.ignatz.utils.Pair;
+
 import static xyz.ignatz.antlr4.java9.utils.Blocks.*;
-import static xyz.ignatz.flowchart.module.Factory.*;
+import static xyz.ignatz.flowchart.Factory.*;
 
 import java.util.*;
 
@@ -15,135 +17,97 @@ public class Java9FlowchartVisitor extends Java9BaseVisitor<Block> {
     List<Flowchart> flowcharts = new ArrayList<>();
     JavaName name = new JavaName();
 
-    public List<Flowchart> getFlowcharts() {
-        return new ArrayList<>(flowcharts);
-    }
-
-    @Override
-    protected Block aggregateResult(Block block, Block next) {
-        return link(block, next);
+    public List<Flowchart> flowcharts() {
+        return flowcharts;
     }
 
     @Override
     public Block visitIfThenStatement(Java9Parser.IfThenStatementContext ctx) {
-        return ifThen(judge(ctx), visit(ctx.statement()));
+        return ifBlock(ctx, visit(ctx.statement()));
     }
 
     @Override
     public Block visitIfThenElseStatement(Java9Parser.IfThenElseStatementContext ctx) {
-        return ifThenElse(judge(ctx), visit(ctx.statementNoShortIf()), visit(ctx.statement()));
+        return ifBlock(ctx, visit(ctx.statementNoShortIf()), visit(ctx.statement()));
     }
 
     @Override
     public Block visitIfThenElseStatementNoShortIf(Java9Parser.IfThenElseStatementNoShortIfContext ctx) {
-        return ifThenElse(judge(ctx), visit(ctx.statementNoShortIf(0)), visit(ctx.statementNoShortIf(1)));
+        return ifBlock(ctx, visit(ctx.statementNoShortIf(0)), visit(ctx.statementNoShortIf(1)));
     }
 
     @Override
     public Block visitSwitchStatement(Java9Parser.SwitchStatementContext ctx) {
-        Map<String, Node> map = new HashMap<>();
-        Block body = null;
-        for (Java9Parser.SwitchBlockStatementGroupContext group : ctx.switchBlock().switchBlockStatementGroup()) {
+        List<Pair<Block, List<String>>> blocks = new ArrayList<>();
+        ctx.switchBlock().switchBlockStatementGroup().forEach(group -> {
             Block block = visit(group.blockStatements());
-            Node start = block.getStart();
-            group.switchLabels().switchLabel().forEach(lab -> map.put(lab.getText(), start));
-            body = link(body, block);
-        }
-        return block("switch (" + ctx.expression().getText() + ")", ctx.start.getLine(), map)
-                .link(body).modifyLinkType("break", "");
+            List<String> labels = new ArrayList<>();
+            group.switchLabels().switchLabel().forEach(label -> labels.add(label.getText()));
+            blocks.add(new Pair(block, labels));
+        });
+        return switchBlock(ctx.expression().getText(), ctx.start.getLine(), blocks);
     }
 
     @Override
     public Block visitDoStatement(Java9Parser.DoStatementContext ctx) {
-        return loop(judge(ctx), visit(ctx.statement()), false);
+        return loop(ctx, visit(ctx.statement()), false);
     }
 
     @Override
     public Block visitBasicForStatement(Java9Parser.BasicForStatementContext ctx) {
-        return loop(judge(ctx), visit(ctx.statement()).link(block(ctx.forUpdate())), true);
+        return loop(ctx, visit(ctx.statement()).link(block(ctx.forUpdate())), true);
     }
 
     @Override
     public Block visitBasicForStatementNoShortIf(Java9Parser.BasicForStatementNoShortIfContext ctx) {
-        return loop(judge(ctx), visit(ctx.statementNoShortIf()).link(block(ctx.forUpdate())), true);
+        return loop(ctx, visit(ctx.statementNoShortIf()).link(block(ctx.forUpdate())), true);
     }
 
     @Override
     public Block visitWhileStatement(Java9Parser.WhileStatementContext ctx) {
-        return loop(judge(ctx), visit(ctx.statement()), true);
+        return loop(ctx, visit(ctx.statement()), true);
     }
 
     @Override
     public Block visitWhileStatementNoShortIf(Java9Parser.WhileStatementNoShortIfContext ctx) {
-        return loop(judge(ctx), visit(ctx.statementNoShortIf()), true);
-    }
-
-    @Override
-    public Block visitNormalClassDeclaration(Java9Parser.NormalClassDeclarationContext ctx) {
-        name.push('$', ctx.identifier().getText());
-        super.visitNormalClassDeclaration(ctx);
-        name.pop('$');
-        return null;
-    }
-
-    @Override
-    public Block visitEnumDeclaration(Java9Parser.EnumDeclarationContext ctx) {
-        name.push('$', ctx.identifier().getText());
-        super.visitEnumDeclaration(ctx);
-        name.pop('$');
-        return null;
-    }
-
-    @Override
-    public Block visitNormalInterfaceDeclaration(Java9Parser.NormalInterfaceDeclarationContext ctx) {
-        name.push('$', ctx.identifier().getText());
-        super.visitNormalInterfaceDeclaration(ctx);
-        name.pop('$');
-        return null;
-    }
-
-    @Override
-    public Block visitAnnotationTypeDeclaration(Java9Parser.AnnotationTypeDeclarationContext ctx) {
-        name.push('$', ctx.identifier().getText());
-        super.visitAnnotationTypeDeclaration(ctx);
-        name.pop('$');
-        return null;
+        return loop(ctx, visit(ctx.statementNoShortIf()), true);
     }
 
     @Override
     public Block visitMethodDeclaration(Java9Parser.MethodDeclarationContext ctx) {
         String dsc = name.toString() + '#' + ctx.methodHeader().methodDeclarator().getText();
         name.push('#', ctx.methodHeader().methodDeclarator().identifier().getText());
-        flowcharts.add(new Flowchart(name.toString(), block(dsc, ctx.start.getLine()).link(visit(ctx.methodBody()))));
+        flowcharts.add(flowchart(name.toString(), block(dsc, ctx.start.getLine()).link(visit(ctx.methodBody()))));
         name.pop('#');
         return null;
     }
 
     @Override
-    public Block visitLocalVariableDeclaration(Java9Parser.LocalVariableDeclarationContext ctx) {
-        return block(ctx);
-    }
-
-    @Override
-    public Block visitStatementExpressionList(Java9Parser.StatementExpressionListContext ctx) {
-        return block(ctx);
-    }
-
-    @Override
-    public Block visitEmptyStatement(Java9Parser.EmptyStatementContext ctx) {
-        return block(ctx);
+    public Block visitChildren(RuleNode node) {
+        if (!ParserRuleContext.class.isInstance(node)) return super.visitChildren(node);
+        ParserRuleContext ctx = (ParserRuleContext) node;
+        String type = Java9ContextClassifier.type(ctx);
+        if (type == null) return super.visitChildren(node);
+        if (type.equals("atom")) return block(ctx);
+        if (type.equals("name")) {
+            name.push('$', ctx.getRuleContext(Java9Parser.IdentifierContext.class, 0).getText());
+            super.visitChildren(node);
+            name.pop('$');
+            return null;
+        }
+        return super.visitChildren(node);
     }
 
     @Override
-    public Block visitExpressionStatement(Java9Parser.ExpressionStatementContext ctx) {
-        return block(ctx);
+    protected Block aggregateResult(Block block, Block next) {
+        return block(block, next);
     }
 
     @Override
     public Block visitAssertStatement(Java9Parser.AssertStatementContext ctx) {
         List<Java9Parser.ExpressionContext> exp = ctx.expression();
         String info = ctx.expression().size() == 1 ? "assert failed" : "assert " + exp.get(1).getText();
-        return judge(ctx).modifyLinkType("true", "")
+        return block(ctx.expression(0), "true", "false").move("true", "")
                 .link(block(info, ctx.start.getLine(), "assert failed"), "false");
         // TODO: assertStatement
     }
@@ -151,14 +115,14 @@ public class Java9FlowchartVisitor extends Java9BaseVisitor<Block> {
     @Override
     public Block visitBreakStatement(Java9Parser.BreakStatementContext ctx) {
         String label = ctx.identifier() == null ? "" : ctx.identifier().getText();
-        return block(ctx, label).modifyLinkType(label, "break");
+        return block(ctx, label).move(label, "break");
         // TODO: break label
     }
 
     @Override
     public Block visitContinueStatement(Java9Parser.ContinueStatementContext ctx) {
         String label = ctx.identifier() == null ? "" : ctx.identifier().getText();
-        return block(ctx, label).modifyLinkType(label, "continue");
+        return block(ctx, label).move(label, "continue");
         // TODO: continue label
     }
 

+ 22 - 14
java9-flowchart/src/main/java/xyz/ignatz/antlr4/java9/utils/Blocks.java

@@ -2,37 +2,45 @@ package xyz.ignatz.antlr4.java9.utils;
 
 import org.antlr.v4.runtime.ParserRuleContext;
 import xyz.ignatz.antlr4.java9.recognizer.Java9Parser;
-import xyz.ignatz.flowchart.module.Block;
-import xyz.ignatz.flowchart.module.Node;
-import static xyz.ignatz.antlr4.Utils.*;
+import xyz.ignatz.flowchart.Block;
+import xyz.ignatz.flowchart.Factory;
+import xyz.ignatz.flowchart.Node;
+
+import static xyz.ignatz.antlr4.Utils.getFullText;
 
 import java.util.*;
 
 public class Blocks {
 
-    public static Block judge(ParserRuleContext ctx) {
+    private static Block judge(ParserRuleContext ctx) {
         List<ParserRuleContext> exp = ctx.getRuleContexts(Java9Parser.ExpressionContext.class);
         return exp.isEmpty()
-                ? xyz.ignatz.flowchart.module.Factory.block("true", ctx.start.getLine(), "true")
-                : block(exp.get(0), Arrays.asList("true", "false"));
+                ? Factory.block("true", ctx.start.getLine(), "true")
+                : block(exp.get(0), "true", "false");
     }
 
     public static Block block(ParserRuleContext ctx) {
         return block(ctx, "");
     }
 
-    public static Block block(ParserRuleContext ctx, String label) {
-        return block(ctx, Arrays.asList(label));
+    public static Block block(ParserRuleContext ctx, String... labels) {
+        return block(ctx, new HashMap<String, Node>(){{ for (String label : labels) put(label, null); }});
     }
 
-    public static Block block(ParserRuleContext ctx, Collection<String> labels) {
-        Map<String, Node> links = new HashMap<>();
-        labels.forEach(label -> links.put(label, null));
-        return block(ctx, links);
+    public static Block block(ParserRuleContext ctx, Map<String, Node> links) {
+        return ctx == null ? null : Factory.block(getFullText(ctx), ctx.getStart().getLine(), links);
     }
 
-    public static Block block(ParserRuleContext ctx, Map<String, Node> links) {
-        return ctx == null ? null : new Block(new Node(getFullText(ctx), ctx.getStart().getLine(), links));
+    public static Block ifBlock(ParserRuleContext ctx, Block block) {
+        return Factory.ifBlock(judge(ctx), block);
+    }
+
+    public static Block ifBlock(ParserRuleContext ctx, Block blockTrue, Block blockFalse) {
+        return Factory.ifBlock(judge(ctx), blockTrue, blockFalse);
+    }
+
+    public static Block loop(ParserRuleContext ctx, Block block, boolean judgeFirst) {
+        return Factory.loop(judge(ctx), block, judgeFirst);
     }
 
 }

+ 3 - 0
java9-flowchart/src/main/resources/META-INF/MANIFEST.MF

@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: xyz.ignatz.antlr4.java9.Java9FlowchartGenerator
+

BIN
output/flowchart/Person#main.png


+ 178 - 572
output/flowchart/Person#main.svg

@@ -1,673 +1,279 @@
-<svg width="1011px" height="1802px"
- viewBox="0.00 0.00 1011.30 1802.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1.0 1.0) rotate(0.0) translate(4.0 1798.0)">
+<svg width="706px" height="856px"
+ viewBox="0.00 0.00 705.65 856.40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1.0 1.0) rotate(0.0) translate(4.0 852.4)">
 <title>Person#main</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-1798 1007.3,-1798 1007.3,4 -4,4"/>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-852.4 701.65,-852.4 701.65,4 -4,4"/>
 <!-- END -->
 <g id="node1" class="node">
 <title>END</title>
-<path fill="none" stroke="black" d="M438,-213.6C438,-213.6 408,-213.6 408,-213.6 402,-213.6 396,-207.6 396,-201.6 396,-201.6 396,-189.6 396,-189.6 396,-183.6 402,-177.6 408,-177.6 408,-177.6 438,-177.6 438,-177.6 444,-177.6 450,-183.6 450,-189.6 450,-189.6 450,-201.6 450,-201.6 450,-207.6 444,-213.6 438,-213.6"/>
-<text text-anchor="middle" x="423" y="-191.4" font-family="Times,serif" font-size="14.00">END</text>
+<path fill="none" stroke="black" d="M188.04,-36C188.04,-36 158.04,-36 158.04,-36 152.04,-36 146.04,-30 146.04,-24 146.04,-24 146.04,-12 146.04,-12 146.04,-6 152.04,0 158.04,0 158.04,0 188.04,0 188.04,0 194.04,0 200.04,-6 200.04,-12 200.04,-12 200.04,-24 200.04,-24 200.04,-30 194.04,-36 188.04,-36"/>
+<text text-anchor="middle" x="173.04" y="-13.8" font-family="Times,serif" font-size="14.00">END</text>
 </g>
 <!-- char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt; -->
 <g id="node2" class="node">
 <title>char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="798.41,-1289.4 699.59,-1289.4 699.59,-1253.4 798.41,-1253.4 798.41,-1289.4"/>
-<text text-anchor="start" x="707.54" y="-1268.2" font-family="Times,serif" font-size="14.00">char i = &#39;a&#39;</text>
-<text text-anchor="start" x="769.46" y="-1268.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;18</text>
+<polygon fill="none" stroke="black" points="415.45,-343.8 316.63,-343.8 316.63,-307.8 415.45,-307.8 415.45,-343.8"/>
+<text text-anchor="start" x="324.58" y="-322.6" font-family="Times,serif" font-size="14.00">char i = &#39;a&#39;</text>
+<text text-anchor="start" x="386.49" y="-322.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;18</text>
 </g>
 <!-- switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt; -->
 <g id="node3" class="node">
 <title>switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="798,-1216.4 709.91,-1198.4 798,-1180.4 886.09,-1198.4 798,-1216.4"/>
-<text text-anchor="start" x="760.87" y="-1195.2" font-family="Times,serif" font-size="14.00">switch (i)</text>
-<text text-anchor="start" x="814.13" y="-1195.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;19</text>
+<polygon fill="none" stroke="black" points="297.04,-270.8 208.94,-252.8 297.04,-234.8 385.13,-252.8 297.04,-270.8"/>
+<text text-anchor="start" x="259.91" y="-249.6" font-family="Times,serif" font-size="14.00">switch (i)</text>
+<text text-anchor="start" x="313.17" y="-249.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;19</text>
 </g>
 <!-- char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt;&#45;&gt;switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt; -->
 <g id="edge1" class="edge">
 <title>char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt;&#45;&gt;switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M760.86,-1253.21C767.17,-1244.07 775.02,-1232.7 781.87,-1222.77"/>
-<polygon fill="black" stroke="black" points="784.78,-1224.72 787.58,-1214.5 779.02,-1220.74 784.78,-1224.72"/>
-</g>
-<!-- System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt; -->
-<g id="node4" class="node">
-<title>System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="945.08,-1127.6 758.92,-1127.6 758.92,-1091.6 945.08,-1091.6 945.08,-1127.6"/>
-<text text-anchor="start" x="766.96" y="-1106.4" font-family="Times,serif" font-size="14.00">System.out.println(&quot;123&quot;);</text>
-<text text-anchor="start" x="916.04" y="-1106.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;22</text>
-</g>
-<!-- switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge2" class="edge">
-<title>switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M820.09,-1184.55C828.17,-1178.77 836.64,-1171.25 842,-1162.4 846.41,-1155.13 848.93,-1146.32 850.36,-1138.05"/>
-<polygon fill="black" stroke="black" points="853.85,-1138.37 851.64,-1128.01 846.9,-1137.48 853.85,-1138.37"/>
-<text text-anchor="middle" x="869.76" y="-1149.8" font-family="Times,serif" font-size="14.00">case&#39;a&#39;:</text>
-</g>
-<!-- switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge4" class="edge">
-<title>switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M792.81,-1180.97C790.42,-1170.25 789.27,-1156.29 795.24,-1145.6 797.62,-1141.34 800.75,-1137.53 804.33,-1134.14"/>
-<polygon fill="black" stroke="black" points="806.63,-1136.79 812.19,-1127.77 802.22,-1131.35 806.63,-1136.79"/>
-<text text-anchor="middle" x="816.38" y="-1149.8" font-family="Times,serif" font-size="14.00">default:</text>
+<path fill="none" stroke="black" d="M349.34,-307.61C340.06,-298.06 328.41,-286.08 318.46,-275.85"/>
+<polygon fill="black" stroke="black" points="320.74,-273.16 311.26,-268.43 315.72,-278.04 320.74,-273.16"/>
 </g>
 <!-- System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt; -->
-<g id="node5" class="node">
+<g id="node4" class="node">
 <title>System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="975.08,-1019.6 788.92,-1019.6 788.92,-983.6 975.08,-983.6 975.08,-1019.6"/>
-<text text-anchor="start" x="796.96" y="-998.4" font-family="Times,serif" font-size="14.00">System.out.println(&quot;456&quot;);</text>
-<text text-anchor="start" x="946.04" y="-998.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;24</text>
+<polygon fill="none" stroke="black" points="186.12,-182 -0.04,-182 -0.04,-146 186.12,-146 186.12,-182"/>
+<text text-anchor="start" x="8" y="-160.8" font-family="Times,serif" font-size="14.00">System.out.println(&quot;456&quot;);</text>
+<text text-anchor="start" x="157.08" y="-160.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;24</text>
 </g>
 <!-- switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge3" class="edge">
+<g id="edge2" class="edge">
 <title>switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M848.21,-1190.61C885.24,-1182.58 932.73,-1165.17 954,-1127.6 973.96,-1092.34 939.94,-1051.72 912.19,-1026.6"/>
-<polygon fill="black" stroke="black" points="914.41,-1023.89 904.58,-1019.94 909.8,-1029.16 914.41,-1023.89"/>
-<text text-anchor="middle" x="981.15" y="-1105.4" font-family="Times,serif" font-size="14.00">case&#39;b&#39;:</text>
-</g>
-<!-- System.out.println(&quot;789&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;27&lt;/font&gt;&lt;/i&gt; -->
-<g id="node30" class="node">
-<title>System.out.println(&quot;789&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;27&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="854.08,-1073.6 667.92,-1073.6 667.92,-1037.6 854.08,-1037.6 854.08,-1073.6"/>
-<text text-anchor="start" x="675.96" y="-1052.4" font-family="Times,serif" font-size="14.00">System.out.println(&quot;789&quot;);</text>
-<text text-anchor="start" x="825.04" y="-1052.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;27</text>
-</g>
-<!-- switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;789&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;27&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge5" class="edge">
-<title>switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;789&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;27&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M768.87,-1186.17C758.64,-1180.65 748.26,-1172.87 742.49,-1162.4 728.91,-1137.79 737.73,-1105.5 747.29,-1083.09"/>
-<polygon fill="black" stroke="black" points="750.54,-1084.4 751.51,-1073.85 744.17,-1081.49 750.54,-1084.4"/>
-<text text-anchor="middle" x="763.76" y="-1149.8" font-family="Times,serif" font-size="14.00">case&#39;c&#39;:</text>
+<path fill="none" stroke="black" d="M269.95,-240.27C237.54,-226.48 182.64,-203.13 142.58,-186.08"/>
+<polygon fill="black" stroke="black" points="143.82,-182.8 133.25,-182.11 141.08,-189.25 143.82,-182.8"/>
+<text text-anchor="middle" x="236.19" y="-204.2" font-family="Times,serif" font-size="14.00">case&#39;b&#39;:</text>
 </g>
-<!-- System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge6" class="edge">
-<title>System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M856.9,-1091.51C858.52,-1085.82 860.34,-1079.44 862,-1073.6 866.11,-1059.12 870.66,-1042.96 874.39,-1029.72"/>
-<polygon fill="black" stroke="black" points="877.83,-1030.4 877.17,-1019.82 871.09,-1028.5 877.83,-1030.4"/>
+<!-- System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;21&lt;/font&gt;&lt;/i&gt; -->
+<g id="node6" class="node">
+<title>System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;21&lt;/font&gt;&lt;/i&gt;</title>
+<polygon fill="none" stroke="black" points="390.12,-182 203.96,-182 203.96,-146 390.12,-146 390.12,-182"/>
+<text text-anchor="start" x="212" y="-160.8" font-family="Times,serif" font-size="14.00">System.out.println(&quot;123&quot;);</text>
+<text text-anchor="start" x="361.08" y="-160.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;21</text>
+</g>
+<!-- switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;21&lt;/font&gt;&lt;/i&gt; -->
+<g id="edge3" class="edge">
+<title>switch (i)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;19&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;21&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M297.04,-234.65C297.04,-222.52 297.04,-206.02 297.04,-192.12"/>
+<polygon fill="black" stroke="black" points="300.54,-192.11 297.04,-182.11 293.54,-192.11 300.54,-192.11"/>
+<text text-anchor="middle" x="318.8" y="-204.2" font-family="Times,serif" font-size="14.00">case&#39;a&#39;:</text>
 </g>
 <!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt; -->
-<g id="node6" class="node">
+<g id="node5" class="node">
 <title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="888.98,-946.6 817.02,-946.6 817.02,-910.6 888.98,-910.6 888.98,-946.6"/>
-<text text-anchor="start" x="825.01" y="-925.4" font-family="Times,serif" font-size="14.00">break;</text>
-<text text-anchor="start" x="859.99" y="-925.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;25</text>
+<polygon fill="none" stroke="black" points="165.02,-109 93.06,-109 93.06,-73 165.02,-73 165.02,-109"/>
+<text text-anchor="start" x="101.05" y="-87.8" font-family="Times,serif" font-size="14.00">break;</text>
+<text text-anchor="start" x="136.03" y="-87.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;25</text>
 </g>
 <!-- System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt;&#45;&gt;break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge7" class="edge">
+<g id="edge4" class="edge">
 <title>System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;24&lt;/font&gt;&lt;/i&gt;&#45;&gt;break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M874.98,-983.41C871.63,-975.22 867.55,-965.22 863.82,-956.08"/>
-<polygon fill="black" stroke="black" points="866.98,-954.56 859.96,-946.63 860.5,-957.21 866.98,-954.56"/>
+<path fill="none" stroke="black" d="M101.75,-145.81C105.95,-137.53 111.08,-127.41 115.76,-118.19"/>
+<polygon fill="black" stroke="black" points="119,-119.53 120.41,-109.03 112.76,-116.37 119,-119.53"/>
 </g>
-<!-- age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt; -->
-<g id="node7" class="node">
-<title>age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="802.21,-857.8 719.79,-857.8 719.79,-821.8 802.21,-821.8 802.21,-857.8"/>
-<text text-anchor="start" x="727.89" y="-836.6" font-family="Times,serif" font-size="14.00">age*=2;</text>
-<text text-anchor="start" x="773.11" y="-836.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;32</text>
+<!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt;&#45;&gt;END -->
+<g id="edge5" class="edge">
+<title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt;&#45;&gt;END</title>
+<path fill="none" stroke="black" d="M139.69,-72.81C144.93,-64.35 151.36,-53.98 157.17,-44.61"/>
+<polygon fill="black" stroke="black" points="160.19,-46.37 162.49,-36.03 154.24,-42.69 160.19,-46.37"/>
 </g>
-<!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt;&#45;&gt;age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge8" class="edge">
-<title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;25&lt;/font&gt;&lt;/i&gt;&#45;&gt;age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M834.82,-910.45C821.09,-897.49 802.05,-879.53 786.75,-865.1"/>
-<polygon fill="black" stroke="black" points="788.81,-862.23 779.14,-857.91 784.01,-867.32 788.81,-862.23"/>
+<!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt; -->
+<g id="node7" class="node">
+<title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;</title>
+<polygon fill="none" stroke="black" points="269.02,-109 197.06,-109 197.06,-73 269.02,-73 269.02,-109"/>
+<text text-anchor="start" x="205.05" y="-87.8" font-family="Times,serif" font-size="14.00">break;</text>
+<text text-anchor="start" x="240.03" y="-87.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;22</text>
 </g>
-<!-- age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt; -->
-<g id="node8" class="node">
-<title>age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="650,-946.6 566.53,-928.6 650,-910.6 733.47,-928.6 650,-946.6"/>
-<text text-anchor="start" x="615.34" y="-925.4" font-family="Times,serif" font-size="14.00">age &lt; 30</text>
-<text text-anchor="start" x="663.66" y="-925.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;33</text>
+<!-- System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;21&lt;/font&gt;&lt;/i&gt;&#45;&gt;break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt; -->
+<g id="edge6" class="edge">
+<title>System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;21&lt;/font&gt;&lt;/i&gt;&#45;&gt;break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M281.55,-145.81C273.61,-137 263.8,-126.13 255.09,-116.46"/>
+<polygon fill="black" stroke="black" points="257.68,-114.11 248.39,-109.03 252.49,-118.8 257.68,-114.11"/>
 </g>
-<!-- age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge9" class="edge">
-<title>age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M726.37,-857.94C717.12,-863.15 707.37,-869.25 699,-875.8 688.03,-884.38 677.24,-895.42 668.59,-905.1"/>
-<polygon fill="black" stroke="black" points="665.78,-902.99 661.87,-912.84 671.07,-907.58 665.78,-902.99"/>
+<!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;&#45;&gt;END -->
+<g id="edge7" class="edge">
+<title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;22&lt;/font&gt;&lt;/i&gt;&#45;&gt;END</title>
+<path fill="none" stroke="black" d="M218.52,-72.81C211.15,-64.09 202.06,-53.34 193.95,-43.75"/>
+<polygon fill="black" stroke="black" points="196.56,-41.41 187.43,-36.03 191.21,-45.93 196.56,-41.41"/>
 </g>
-<!-- age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt;&#45;&gt;age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge10" class="edge">
-<title>age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt;&#45;&gt;age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M668.86,-914.63C678.07,-908.17 689.24,-900.15 699,-892.6 710.5,-883.71 722.84,-873.54 733.46,-864.57"/>
-<polygon fill="black" stroke="black" points="735.85,-867.13 741.21,-857.99 731.32,-861.79 735.85,-867.13"/>
-<text text-anchor="middle" x="729.88" y="-880" font-family="Times,serif" font-size="14.00">true</text>
+<!-- System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt; -->
+<g id="node8" class="node">
+<title>System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;</title>
+<polygon fill="none" stroke="black" points="489.83,-559.6 276.25,-559.6 276.25,-523.6 489.83,-523.6 489.83,-559.6"/>
+<text text-anchor="start" x="284.4" y="-538.4" font-family="Times,serif" font-size="14.00">System.out.println(&quot;年龄太大&quot;);</text>
+<text text-anchor="start" x="467.68" y="-538.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;5</text>
 </g>
-<!-- age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt; -->
+<!-- i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
 <g id="node9" class="node">
-<title>age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="625,-857.8 548.69,-839.8 625,-821.8 701.31,-839.8 625,-857.8"/>
-<text text-anchor="start" x="593.84" y="-836.6" font-family="Times,serif" font-size="14.00">age&gt;10</text>
-<text text-anchor="start" x="635.16" y="-836.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;36</text>
-</g>
-<!-- age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge11" class="edge">
-<title>age &lt; 30&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;33&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M645.3,-911.27C641.68,-898.71 636.61,-881.1 632.44,-866.63"/>
-<polygon fill="black" stroke="black" points="635.73,-865.4 629.6,-856.76 629,-867.34 635.73,-865.4"/>
-<text text-anchor="middle" x="653.21" y="-880" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;&#45;&gt;END -->
-<g id="edge13" class="edge">
-<title>age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;&#45;&gt;END</title>
-<path fill="none" stroke="black" d="M633.97,-823.7C643.12,-806.83 656,-778.4 656,-752 656,-752 656,-752 656,-302.6 656,-217.77 526.47,-200.51 460.57,-197.22"/>
-<polygon fill="black" stroke="black" points="460.32,-193.71 450.18,-196.79 460.03,-200.7 460.32,-193.71"/>
-<text text-anchor="middle" x="669.21" y="-540.6" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt; -->
-<g id="node10" class="node">
-<title>age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="519,-769 423.54,-751 519,-733 614.46,-751 519,-769"/>
-<text text-anchor="start" x="478.06" y="-747.8" font-family="Times,serif" font-size="14.00">age%3==2</text>
-<text text-anchor="start" x="538.94" y="-747.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;37</text>
-</g>
-<!-- age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;&#45;&gt;age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge12" class="edge">
-<title>age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;&#45;&gt;age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M608.44,-825.24C591.14,-811.07 563.81,-788.69 543.91,-772.39"/>
-<polygon fill="black" stroke="black" points="546.1,-769.67 536.15,-766.04 541.67,-775.09 546.1,-769.67"/>
-<text text-anchor="middle" x="592.88" y="-791.2" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt; -->
-<g id="node11" class="node">
-<title>age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="392.11,-680.2 301.89,-680.2 301.89,-644.2 392.11,-644.2 392.11,-680.2"/>
-<text text-anchor="start" x="309.95" y="-659" font-family="Times,serif" font-size="14.00">age += 2;</text>
-<text text-anchor="start" x="363.05" y="-659" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;39</text>
-</g>
-<!-- age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt;&#45;&gt;age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge14" class="edge">
-<title>age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt;&#45;&gt;age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M494.36,-737.56C467.1,-723.81 422.69,-701.4 389.74,-684.77"/>
-<polygon fill="black" stroke="black" points="391.28,-681.62 380.77,-680.24 388.12,-687.87 391.28,-681.62"/>
-<text text-anchor="middle" x="459.88" y="-702.4" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt; -->
-<g id="node23" class="node">
-<title>age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="519,-410.4 434.79,-392.4 519,-374.4 603.21,-392.4 519,-410.4"/>
-<text text-anchor="start" x="483.89" y="-389.2" font-family="Times,serif" font-size="14.00">age == 4</text>
-<text text-anchor="start" x="533.11" y="-389.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;51</text>
-</g>
-<!-- age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt;&#45;&gt;age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge15" class="edge">
-<title>age%3==2&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;37&lt;/font&gt;&lt;/i&gt;&#45;&gt;age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M519,-732.71C519,-715.19 519,-687.31 519,-663.2 519,-663.2 519,-663.2 519,-499.4 519,-472.64 519,-442.07 519,-420.66"/>
-<polygon fill="black" stroke="black" points="522.5,-420.66 519,-410.66 515.5,-420.66 522.5,-420.66"/>
-<text text-anchor="middle" x="532.21" y="-585" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt; -->
-<g id="node12" class="node">
-<title>age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="347,-607.2 249.47,-589.2 347,-571.2 444.53,-589.2 347,-607.2"/>
-<text text-anchor="start" x="304.89" y="-586" font-family="Times,serif" font-size="14.00">age &gt;= 100</text>
-<text text-anchor="start" x="368.11" y="-586" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;40</text>
-</g>
-<!-- age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge16" class="edge">
-<title>age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M347,-644.01C347,-635.99 347,-626.25 347,-617.27"/>
-<polygon fill="black" stroke="black" points="350.5,-617.23 347,-607.23 343.5,-617.23 350.5,-617.23"/>
-</g>
-<!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;41&lt;/font&gt;&lt;/i&gt; -->
-<g id="node13" class="node">
-<title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;41&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="429.98,-464.4 358.02,-464.4 358.02,-428.4 429.98,-428.4 429.98,-464.4"/>
-<text text-anchor="start" x="366.01" y="-443.2" font-family="Times,serif" font-size="14.00">break;</text>
-<text text-anchor="start" x="400.99" y="-443.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;41</text>
-</g>
-<!-- age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt;&#45;&gt;break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;41&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge17" class="edge">
-<title>age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt;&#45;&gt;break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;41&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M354,-572.32C360.03,-558.31 368.73,-537.23 375,-518.4 379.77,-504.07 384.19,-487.81 387.57,-474.48"/>
-<polygon fill="black" stroke="black" points="391.03,-475.05 390.04,-464.5 384.24,-473.36 391.03,-475.05"/>
-<text text-anchor="middle" x="379.88" y="-540.6" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt; -->
-<g id="node15" class="node">
-<title>age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="275,-518.4 184.13,-500.4 275,-482.4 365.87,-500.4 275,-518.4"/>
-<text text-anchor="start" x="236.39" y="-497.2" font-family="Times,serif" font-size="14.00">age &lt;= 50</text>
-<text text-anchor="start" x="292.61" y="-497.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;42</text>
-</g>
-<!-- age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge18" class="edge">
-<title>age &gt;= 100&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;40&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M334.46,-573.08C323.24,-559.56 306.64,-539.54 293.83,-524.1"/>
-<polygon fill="black" stroke="black" points="296.24,-521.52 287.16,-516.06 290.85,-525.99 296.24,-521.52"/>
-<text text-anchor="middle" x="331.21" y="-540.6" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- ++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt; -->
-<g id="node14" class="node">
-<title>++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="461.11,-36 384.89,-36 384.89,0 461.11,0 461.11,-36"/>
-<text text-anchor="start" x="392.95" y="-14.8" font-family="Times,serif" font-size="14.00">++age;</text>
-<text text-anchor="start" x="432.05" y="-14.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;58</text>
-</g>
-<!-- break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;41&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge19" class="edge">
-<title>break;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;41&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M391.94,-428.16C386.69,-384.29 373.24,-271.59 373,-267.6 368.18,-185.65 396.91,-91.18 412.87,-45.92"/>
-<polygon fill="black" stroke="black" points="416.25,-46.86 416.35,-36.26 409.67,-44.48 416.25,-46.86"/>
-</g>
-<!-- ++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge20" class="edge">
-<title>++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M384.72,-18.78C280.59,-19.22 0,-27.65 0,-105.8 0,-752 0,-752 0,-752 0,-807.19 387.33,-829.28 552.16,-836.18"/>
-<polygon fill="black" stroke="black" points="552.08,-839.68 562.21,-836.59 552.36,-832.69 552.08,-839.68"/>
-</g>
-<!-- age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt; -->
-<g id="node16" class="node">
-<title>age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="278,-410.4 190.44,-392.4 278,-374.4 365.56,-392.4 278,-410.4"/>
-<text text-anchor="start" x="241.01" y="-389.2" font-family="Times,serif" font-size="14.00">age != 24</text>
-<text text-anchor="start" x="293.99" y="-389.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;43</text>
+<title>i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
+<polygon fill="none" stroke="black" points="501.04,-432.6 439.54,-414.6 501.04,-396.6 562.53,-414.6 501.04,-432.6"/>
+<text text-anchor="start" x="477.65" y="-411.4" font-family="Times,serif" font-size="14.00">i&lt;12</text>
+<text text-anchor="start" x="503.43" y="-411.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;13</text>
 </g>
-<!-- age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt;&#45;&gt;age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge21" class="edge">
-<title>age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt;&#45;&gt;age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M275.48,-482.37C275.95,-465.68 276.68,-439.98 277.23,-420.48"/>
-<polygon fill="black" stroke="black" points="280.73,-420.48 277.52,-410.39 273.74,-420.29 280.73,-420.48"/>
-<text text-anchor="middle" x="287.88" y="-442.2" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age /= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;47&lt;/font&gt;&lt;/i&gt; -->
-<g id="node21" class="node">
-<title>age /= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;47&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="172.11,-410.4 85.89,-410.4 85.89,-374.4 172.11,-374.4 172.11,-410.4"/>
-<text text-anchor="start" x="93.95" y="-389.2" font-family="Times,serif" font-size="14.00">age /= 2;</text>
-<text text-anchor="start" x="143.05" y="-389.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;47</text>
-</g>
-<!-- age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt;&#45;&gt;age /= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;47&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge22" class="edge">
-<title>age &lt;= 50&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;42&lt;/font&gt;&lt;/i&gt;&#45;&gt;age /= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;47&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M256.51,-485.98C232.48,-468.53 190.16,-437.8 160.9,-416.56"/>
-<polygon fill="black" stroke="black" points="162.8,-413.61 152.65,-410.57 158.69,-419.28 162.8,-413.61"/>
-<text text-anchor="middle" x="237.21" y="-442.2" font-family="Times,serif" font-size="14.00">false</text>
+<!-- System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
+<g id="edge8" class="edge">
+<title>System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M383.87,-523.43C385.43,-507.89 389.81,-485.15 402.04,-469.6 417.4,-450.07 441.86,-436.63 462.62,-428.05"/>
+<polygon fill="black" stroke="black" points="464.11,-431.22 472.16,-424.33 461.57,-424.7 464.11,-431.22"/>
 </g>
-<!-- age *= 3;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;44&lt;/font&gt;&lt;/i&gt; -->
-<g id="node17" class="node">
-<title>age *= 3;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;44&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="237.71,-321.6 148.29,-321.6 148.29,-285.6 237.71,-285.6 237.71,-321.6"/>
-<text text-anchor="start" x="156.39" y="-300.4" font-family="Times,serif" font-size="14.00">age *= 3;</text>
-<text text-anchor="start" x="208.61" y="-300.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;44</text>
-</g>
-<!-- age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;&#45;&gt;age *= 3;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;44&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge23" class="edge">
-<title>age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;&#45;&gt;age *= 3;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;44&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M263.96,-377.07C251.16,-363.99 231.97,-344.4 216.78,-328.88"/>
-<polygon fill="black" stroke="black" points="219.18,-326.33 209.69,-321.64 214.18,-331.23 219.18,-326.33"/>
-<text text-anchor="middle" x="254.88" y="-343.8" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- assert &quot;error&quot;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt; -->
-<g id="node20" class="node">
-<title>assert &quot;error&quot;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="366.49,-321.6 255.51,-321.6 255.51,-285.6 366.49,-285.6 366.49,-321.6"/>
-<text text-anchor="start" x="263.51" y="-300.4" font-family="Times,serif" font-size="14.00">assert &quot;error&quot;</text>
-<text text-anchor="start" x="337.49" y="-300.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;43</text>
-</g>
-<!-- age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;&#45;&gt;assert &quot;error&quot;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge24" class="edge">
-<title>age != 24&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;&#45;&gt;assert &quot;error&quot;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M284.05,-375.48C288.77,-363.07 295.42,-345.58 300.94,-331.07"/>
-<polygon fill="black" stroke="black" points="304.25,-332.2 304.53,-321.61 297.71,-329.71 304.25,-332.2"/>
-<text text-anchor="middle" x="311.21" y="-343.8" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;45&lt;/font&gt;&lt;/i&gt; -->
-<g id="node18" class="node">
-<title>continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;45&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="237.6,-213.6 148.4,-213.6 148.4,-177.6 237.6,-177.6 237.6,-213.6"/>
-<text text-anchor="start" x="156.45" y="-192.4" font-family="Times,serif" font-size="14.00">continue;</text>
-<text text-anchor="start" x="208.55" y="-192.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;45</text>
-</g>
-<!-- age *= 3;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;44&lt;/font&gt;&lt;/i&gt;&#45;&gt;continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;45&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge25" class="edge">
-<title>age *= 3;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;44&lt;/font&gt;&lt;/i&gt;&#45;&gt;continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;45&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M193,-285.57C193,-268.98 193,-243.48 193,-224.03"/>
-<polygon fill="black" stroke="black" points="196.5,-223.94 193,-213.94 189.5,-223.94 196.5,-223.94"/>
-</g>
-<!-- age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt; -->
-<g id="node19" class="node">
-<title>age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="156,-124.8 72.53,-106.8 156,-88.8 239.47,-106.8 156,-124.8"/>
-<text text-anchor="start" x="121.34" y="-103.6" font-family="Times,serif" font-size="14.00">age &lt; 80</text>
-<text text-anchor="start" x="169.66" y="-103.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;50</text>
-</g>
-<!-- continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;45&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge26" class="edge">
-<title>continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;45&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M185.69,-177.45C180.25,-164.69 172.74,-147.07 166.63,-132.74"/>
-<polygon fill="black" stroke="black" points="169.81,-131.28 162.67,-123.45 163.37,-134.03 169.81,-131.28"/>
-</g>
-<!-- age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;&#45;&gt;age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge27" class="edge">
-<title>age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;&#45;&gt;age += 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;39&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M123.59,-117.92C91.14,-130.3 46,-154.7 46,-194.6 46,-590.2 46,-590.2 46,-590.2 46,-640.12 204.8,-654.98 291.71,-659.37"/>
-<polygon fill="black" stroke="black" points="291.78,-662.88 301.94,-659.86 292.11,-655.89 291.78,-662.88"/>
-<text text-anchor="middle" x="56.88" y="-388.2" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge28" class="edge">
-<title>age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M187.68,-95.5C234.1,-80.41 320.97,-52.17 375.19,-34.54"/>
-<polygon fill="black" stroke="black" points="376.49,-37.8 384.92,-31.38 374.32,-31.14 376.49,-37.8"/>
-<text text-anchor="middle" x="327.21" y="-58.2" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- assert &quot;error&quot;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;&#45;&gt;END -->
-<g id="edge29" class="edge">
-<title>assert &quot;error&quot;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;43&lt;/font&gt;&lt;/i&gt;&#45;&gt;END</title>
-<path fill="none" stroke="black" d="M328.99,-285.57C347.5,-268.06 376.49,-240.62 397.38,-220.85"/>
-<polygon fill="black" stroke="black" points="399.82,-223.36 404.68,-213.94 395.01,-218.27 399.82,-223.36"/>
-<text text-anchor="middle" x="417.62" y="-245.4" font-family="Times,serif" font-size="14.00">assert failed</text>
-</g>
-<!-- age *= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;49&lt;/font&gt;&lt;/i&gt; -->
-<g id="node22" class="node">
-<title>age *= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;49&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="164.71,-267.6 75.29,-267.6 75.29,-231.6 164.71,-231.6 164.71,-267.6"/>
-<text text-anchor="start" x="83.39" y="-246.4" font-family="Times,serif" font-size="14.00">age *= 2;</text>
-<text text-anchor="start" x="135.61" y="-246.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;49</text>
-</g>
-<!-- age /= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;47&lt;/font&gt;&lt;/i&gt;&#45;&gt;age *= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;49&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge30" class="edge">
-<title>age /= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;47&lt;/font&gt;&lt;/i&gt;&#45;&gt;age *= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;49&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M127.9,-374.14C126.36,-350.17 123.58,-306.58 121.76,-278.1"/>
-<polygon fill="black" stroke="black" points="125.24,-277.76 121.11,-268.01 118.26,-278.21 125.24,-277.76"/>
-</g>
-<!-- age *= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;49&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge31" class="edge">
-<title>age *= 2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;49&lt;/font&gt;&lt;/i&gt;&#45;&gt;age &lt; 80&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;50&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M124.41,-231.34C130.61,-207.11 141.93,-162.83 149.2,-134.38"/>
-<polygon fill="black" stroke="black" points="152.69,-134.89 151.77,-124.33 145.91,-133.15 152.69,-134.89"/>
-</g>
-<!-- ++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt; -->
-<g id="node24" class="node">
-<title>++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="540.11,-267.6 463.89,-267.6 463.89,-231.6 540.11,-231.6 540.11,-267.6"/>
-<text text-anchor="start" x="471.95" y="-246.4" font-family="Times,serif" font-size="14.00">++age;</text>
-<text text-anchor="start" x="511.05" y="-246.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;51</text>
-</g>
-<!-- age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge32" class="edge">
-<title>age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M499.89,-378.48C483.43,-366.09 460.81,-345.74 451,-321.6 444.97,-306.78 443.55,-299.76 451,-285.6 453.17,-281.48 456.07,-277.75 459.38,-274.4"/>
-<polygon fill="black" stroke="black" points="461.91,-276.84 467.19,-267.66 457.34,-271.54 461.91,-276.84"/>
-<text text-anchor="middle" x="485.88" y="-343.8" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt; -->
-<g id="node25" class="node">
-<title>age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="544,-321.6 459.79,-303.6 544,-285.6 628.21,-303.6 544,-321.6"/>
-<text text-anchor="start" x="508.89" y="-300.4" font-family="Times,serif" font-size="14.00">age == 5</text>
-<text text-anchor="start" x="558.11" y="-300.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;52</text>
-</g>
-<!-- age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;&#45;&gt;age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge33" class="edge">
-<title>age == 4&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;&#45;&gt;age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M523.7,-375.07C527.3,-362.59 532.33,-345.12 536.48,-330.7"/>
-<polygon fill="black" stroke="black" points="539.91,-331.43 539.32,-320.85 533.19,-329.49 539.91,-331.43"/>
-<text text-anchor="middle" x="547.21" y="-343.8" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- ++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge34" class="edge">
-<title>++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;51&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M496.06,-231.34C482.39,-191.6 448.6,-93.41 432.21,-45.77"/>
-<polygon fill="black" stroke="black" points="435.46,-44.46 428.9,-36.14 428.84,-46.74 435.46,-44.46"/>
-</g>
-<!-- age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge36" class="edge">
-<title>age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M545.26,-285.67C545.87,-271.1 545.67,-249.63 541,-231.6 518.87,-146.13 500.25,-127.94 452,-54 449.83,-50.68 447.39,-47.31 444.88,-44.04"/>
-<polygon fill="black" stroke="black" points="447.57,-41.8 438.57,-36.2 442.12,-46.19 447.57,-41.8"/>
-<text text-anchor="middle" x="530.21" y="-147" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt; -->
-<g id="node26" class="node">
-<title>age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="677,-213.6 592.79,-195.6 677,-177.6 761.21,-195.6 677,-213.6"/>
-<text text-anchor="start" x="641.89" y="-192.4" font-family="Times,serif" font-size="14.00">age == 6</text>
-<text text-anchor="start" x="691.11" y="-192.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;53</text>
-</g>
-<!-- age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt;&#45;&gt;age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge35" class="edge">
-<title>age == 5&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;52&lt;/font&gt;&lt;/i&gt;&#45;&gt;age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M560.84,-289.18C583.8,-270.88 625.11,-237.96 651.77,-216.71"/>
-<polygon fill="black" stroke="black" points="654.23,-219.22 659.87,-210.25 649.87,-213.75 654.23,-219.22"/>
-<text text-anchor="middle" x="641.88" y="-245.4" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age += 6;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt; -->
-<g id="node27" class="node">
-<title>age += 6;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="673.11,-124.8 582.89,-124.8 582.89,-88.8 673.11,-88.8 673.11,-124.8"/>
-<text text-anchor="start" x="590.95" y="-103.6" font-family="Times,serif" font-size="14.00">age += 6;</text>
-<text text-anchor="start" x="644.05" y="-103.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;53</text>
-</g>
-<!-- age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;&#45;&gt;age += 6;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge37" class="edge">
-<title>age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;&#45;&gt;age += 6;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M668.24,-179.08C661.19,-166.6 651.14,-148.79 642.84,-134.09"/>
-<polygon fill="black" stroke="black" points="645.66,-131.96 637.69,-124.97 639.56,-135.4 645.66,-131.96"/>
-<text text-anchor="middle" x="667.88" y="-147" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- age&#45;&#45;;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;55&lt;/font&gt;&lt;/i&gt; -->
-<g id="node28" class="node">
-<title>age&#45;&#45;;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;55&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="760.64,-124.8 691.36,-124.8 691.36,-88.8 760.64,-88.8 760.64,-124.8"/>
-<text text-anchor="start" x="699.18" y="-103.6" font-family="Times,serif" font-size="14.00">age&#45;&#45;;</text>
-<text text-anchor="start" x="731.82" y="-103.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;55</text>
-</g>
-<!-- age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&#45;&#45;;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;55&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge38" class="edge">
-<title>age == 6&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&#45;&#45;;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;55&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M685.76,-179.08C692.81,-166.6 702.86,-148.79 711.16,-134.09"/>
-<polygon fill="black" stroke="black" points="714.44,-135.4 716.31,-124.97 708.34,-131.96 714.44,-135.4"/>
-<text text-anchor="middle" x="718.21" y="-147" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- age += 6;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge39" class="edge">
-<title>age += 6;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;53&lt;/font&gt;&lt;/i&gt;&#45;&gt;++age;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;58&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M612.6,-88.44C601.54,-77.03 585.7,-62.65 569,-54 538.57,-38.24 500.88,-29.43 471.41,-24.6"/>
-<polygon fill="black" stroke="black" points="471.78,-21.11 461.36,-23.05 470.71,-28.03 471.78,-21.11"/>
-</g>
-<!-- continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;56&lt;/font&gt;&lt;/i&gt; -->
-<g id="node29" class="node">
-<title>continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;56&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="811.6,-36 722.4,-36 722.4,0 811.6,0 811.6,-36"/>
-<text text-anchor="start" x="730.45" y="-14.8" font-family="Times,serif" font-size="14.00">continue;</text>
-<text text-anchor="start" x="782.55" y="-14.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;56</text>
-</g>
-<!-- age&#45;&#45;;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;55&lt;/font&gt;&lt;/i&gt;&#45;&gt;continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;56&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge40" class="edge">
-<title>age&#45;&#45;;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;55&lt;/font&gt;&lt;/i&gt;&#45;&gt;continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;56&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M734.1,-88.65C739.94,-76.29 747.93,-59.37 754.58,-45.3"/>
-<polygon fill="black" stroke="black" points="757.81,-46.65 758.92,-36.11 751.48,-43.66 757.81,-46.65"/>
-</g>
-<!-- continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;56&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge41" class="edge">
-<title>continue;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;56&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;36&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M774.08,-36.3C780.51,-53.58 789,-81.08 789,-105.8 789,-752 789,-752 789,-752 789,-779.73 714.85,-809.41 666.27,-825.89"/>
-<polygon fill="black" stroke="black" points="665,-822.62 656.62,-829.1 667.21,-829.26 665,-822.62"/>
-</g>
-<!-- System.out.println(&quot;789&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;27&lt;/font&gt;&lt;/i&gt;&#45;&gt;age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge42" class="edge">
-<title>System.out.println(&quot;789&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;27&lt;/font&gt;&lt;/i&gt;&#45;&gt;age*=2;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;32&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M761,-1037.47C761,-1000.48 761,-912.91 761,-868.16"/>
-<polygon fill="black" stroke="black" points="764.5,-868.02 761,-858.02 757.5,-868.02 764.5,-868.02"/>
+<!-- i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt; -->
+<g id="edge10" class="edge">
+<title>i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M482.83,-401.89C462.01,-388.51 427.43,-366.27 401.29,-349.46"/>
+<polygon fill="black" stroke="black" points="403.08,-346.46 392.78,-343.99 399.3,-352.34 403.08,-346.46"/>
+<text text-anchor="middle" x="459.25" y="-366" font-family="Times,serif" font-size="14.00">false</text>
 </g>
 <!-- age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt; -->
-<g id="node31" class="node">
+<g id="node10" class="node">
 <title>age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="612.71,-1289.4 523.29,-1289.4 523.29,-1253.4 612.71,-1253.4 612.71,-1289.4"/>
-<text text-anchor="start" x="531.39" y="-1268.2" font-family="Times,serif" font-size="14.00">age = 19;</text>
-<text text-anchor="start" x="583.61" y="-1268.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;14</text>
+<polygon fill="none" stroke="black" points="545.75,-343.8 456.32,-343.8 456.32,-307.8 545.75,-307.8 545.75,-343.8"/>
+<text text-anchor="start" x="464.43" y="-322.6" font-family="Times,serif" font-size="14.00">age = 19;</text>
+<text text-anchor="start" x="516.65" y="-322.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;14</text>
+</g>
+<!-- i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt; -->
+<g id="edge9" class="edge">
+<title>i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M501.04,-396.45C501.04,-384.32 501.04,-367.82 501.04,-353.92"/>
+<polygon fill="black" stroke="black" points="504.54,-353.91 501.04,-343.91 497.54,-353.91 504.54,-353.91"/>
+<text text-anchor="middle" x="511.92" y="-366" font-family="Times,serif" font-size="14.00">true</text>
 </g>
 <!-- System.out.println(&quot;234&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;15&lt;/font&gt;&lt;/i&gt; -->
-<g id="node32" class="node">
+<g id="node11" class="node">
 <title>System.out.println(&quot;234&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;15&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="625.08,-1216.4 438.92,-1216.4 438.92,-1180.4 625.08,-1180.4 625.08,-1216.4"/>
-<text text-anchor="start" x="446.96" y="-1195.2" font-family="Times,serif" font-size="14.00">System.out.println(&quot;234&quot;);</text>
-<text text-anchor="start" x="596.04" y="-1195.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;15</text>
+<polygon fill="none" stroke="black" points="594.12,-270.8 407.96,-270.8 407.96,-234.8 594.12,-234.8 594.12,-270.8"/>
+<text text-anchor="start" x="416" y="-249.6" font-family="Times,serif" font-size="14.00">System.out.println(&quot;234&quot;);</text>
+<text text-anchor="start" x="565.08" y="-249.6" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;15</text>
 </g>
 <!-- age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;234&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;15&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge43" class="edge">
+<g id="edge11" class="edge">
 <title>age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;234&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;15&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M559.29,-1253.21C555.08,-1244.93 549.95,-1234.81 545.28,-1225.59"/>
-<polygon fill="black" stroke="black" points="548.28,-1223.77 540.63,-1216.43 542.04,-1226.93 548.28,-1223.77"/>
+<path fill="none" stroke="black" d="M501.04,-307.61C501.04,-299.59 501.04,-289.85 501.04,-280.87"/>
+<polygon fill="black" stroke="black" points="504.54,-280.83 501.04,-270.83 497.54,-280.83 504.54,-280.83"/>
 </g>
 <!-- System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;16&lt;/font&gt;&lt;/i&gt; -->
-<g id="node33" class="node">
+<g id="node12" class="node">
 <title>System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;16&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="625.08,-1127.6 438.92,-1127.6 438.92,-1091.6 625.08,-1091.6 625.08,-1127.6"/>
-<text text-anchor="start" x="446.96" y="-1106.4" font-family="Times,serif" font-size="14.00">System.out.println(&quot;456&quot;);</text>
-<text text-anchor="start" x="596.04" y="-1106.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;16</text>
+<polygon fill="none" stroke="black" points="594.12,-182 407.96,-182 407.96,-146 594.12,-146 594.12,-182"/>
+<text text-anchor="start" x="416" y="-160.8" font-family="Times,serif" font-size="14.00">System.out.println(&quot;456&quot;);</text>
+<text text-anchor="start" x="565.08" y="-160.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;16</text>
 </g>
 <!-- System.out.println(&quot;234&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;15&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;16&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge44" class="edge">
+<g id="edge12" class="edge">
 <title>System.out.println(&quot;234&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;15&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;16&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M532,-1180.25C532,-1168.12 532,-1151.62 532,-1137.72"/>
-<polygon fill="black" stroke="black" points="535.5,-1137.71 532,-1127.71 528.5,-1137.71 535.5,-1137.71"/>
+<path fill="none" stroke="black" d="M501.04,-234.65C501.04,-222.52 501.04,-206.02 501.04,-192.12"/>
+<polygon fill="black" stroke="black" points="504.54,-192.11 501.04,-182.11 497.54,-192.11 504.54,-192.11"/>
 </g>
 <!-- i++&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="node34" class="node">
+<g id="node13" class="node">
 <title>i++&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="669.18,-1019.6 612.82,-1019.6 612.82,-983.6 669.18,-983.6 669.18,-1019.6"/>
-<text text-anchor="start" x="620.66" y="-998.4" font-family="Times,serif" font-size="14.00">i++</text>
-<text text-anchor="start" x="640.34" y="-998.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;13</text>
+<polygon fill="none" stroke="black" points="614.22,-109 557.86,-109 557.86,-73 614.22,-73 614.22,-109"/>
+<text text-anchor="start" x="565.7" y="-87.8" font-family="Times,serif" font-size="14.00">i++</text>
+<text text-anchor="start" x="585.38" y="-87.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;13</text>
 </g>
 <!-- System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;16&lt;/font&gt;&lt;/i&gt;&#45;&gt;i++&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge45" class="edge">
+<g id="edge13" class="edge">
 <title>System.out.println(&quot;456&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;16&lt;/font&gt;&lt;/i&gt;&#45;&gt;i++&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M549.51,-1091.57C567.44,-1074.13 595.48,-1046.86 615.8,-1027.11"/>
-<polygon fill="black" stroke="black" points="618.44,-1029.42 623.17,-1019.94 613.56,-1024.4 618.44,-1029.42"/>
-</g>
-<!-- i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="node35" class="node">
-<title>i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="653,-1378.2 591.51,-1360.2 653,-1342.2 714.49,-1360.2 653,-1378.2"/>
-<text text-anchor="start" x="629.61" y="-1357" font-family="Times,serif" font-size="14.00">i&lt;12</text>
-<text text-anchor="start" x="655.39" y="-1357" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;13</text>
+<path fill="none" stroke="black" d="M521.62,-145.81C532.47,-136.74 545.96,-125.48 557.79,-115.6"/>
+<polygon fill="black" stroke="black" points="560.22,-118.13 565.65,-109.03 555.73,-112.75 560.22,-118.13"/>
 </g>
 <!-- i++&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge46" class="edge">
+<g id="edge14" class="edge">
 <title>i++&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M644.15,-1019.79C647.71,-1040.7 653,-1077.12 653,-1108.6 653,-1272.4 653,-1272.4 653,-1272.4 653,-1292.18 653,-1314.49 653,-1331.54"/>
-<polygon fill="black" stroke="black" points="649.5,-1331.91 653,-1341.91 656.5,-1331.91 649.5,-1331.91"/>
-</g>
-<!-- i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge48" class="edge">
-<title>i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;char i = &#39;a&#39;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;18&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M667.58,-1346.02C682.04,-1332.94 704.55,-1312.59 722.23,-1296.6"/>
-<polygon fill="black" stroke="black" points="724.9,-1298.91 729.97,-1289.6 720.21,-1293.71 724.9,-1298.91"/>
-<text text-anchor="middle" x="722.21" y="-1311.6" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge47" class="edge">
-<title>i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;&#45;&gt;age = 19;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;14&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M639.3,-1346.02C632.59,-1339.51 624.43,-1331.5 617.23,-1324.2 608.7,-1315.54 599.48,-1305.92 591.36,-1297.34"/>
-<polygon fill="black" stroke="black" points="593.67,-1294.69 584.26,-1289.82 588.58,-1299.49 593.67,-1294.69"/>
-<text text-anchor="middle" x="628.88" y="-1311.6" font-family="Times,serif" font-size="14.00">true</text>
-</g>
-<!-- Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt; -->
-<g id="node36" class="node">
-<title>Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M650.79,-1794C650.79,-1794 495.21,-1794 495.21,-1794 489.21,-1794 483.21,-1788 483.21,-1782 483.21,-1782 483.21,-1770 483.21,-1770 483.21,-1764 489.21,-1758 495.21,-1758 495.21,-1758 650.79,-1758 650.79,-1758 656.79,-1758 662.79,-1764 662.79,-1770 662.79,-1770 662.79,-1782 662.79,-1782 662.79,-1788 656.79,-1794 650.79,-1794"/>
-<text text-anchor="start" x="491.36" y="-1772.8" font-family="Times,serif" font-size="14.00">Person#main(String[]args)</text>
-<text text-anchor="start" x="640.64" y="-1772.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;2</text>
+<path fill="none" stroke="black" d="M600.47,-109.17C610.49,-122.84 622.04,-142.96 622.04,-163 622.04,-326.8 622.04,-326.8 622.04,-326.8 622.04,-367.09 577.2,-390.49 542.11,-402.64"/>
+<polygon fill="black" stroke="black" points="540.93,-399.34 532.51,-405.77 543.11,-406 540.93,-399.34"/>
 </g>
 <!-- int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt; -->
-<g id="node37" class="node">
+<g id="node14" class="node">
 <title>int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="621.11,-1721 524.89,-1721 524.89,-1685 621.11,-1685 621.11,-1721"/>
-<text text-anchor="start" x="532.7" y="-1699.8" font-family="Times,serif" font-size="14.00">int age = 10</text>
-<text text-anchor="start" x="599.3" y="-1699.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;3</text>
-</g>
-<!-- Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt;&#45;&gt;int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge49" class="edge">
-<title>Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt;&#45;&gt;int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M573,-1757.81C573,-1749.79 573,-1740.05 573,-1731.07"/>
-<polygon fill="black" stroke="black" points="576.5,-1731.03 573,-1721.03 569.5,-1731.03 576.5,-1731.03"/>
+<polygon fill="none" stroke="black" points="469.15,-775.4 372.93,-775.4 372.93,-739.4 469.15,-739.4 469.15,-775.4"/>
+<text text-anchor="start" x="380.74" y="-754.2" font-family="Times,serif" font-size="14.00">int age = 10</text>
+<text text-anchor="start" x="447.34" y="-754.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;3</text>
 </g>
 <!-- age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt; -->
-<g id="node38" class="node">
+<g id="node15" class="node">
 <title>age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="573,-1648 503.35,-1630 573,-1612 642.65,-1630 573,-1648"/>
-<text text-anchor="start" x="545.34" y="-1626.8" font-family="Times,serif" font-size="14.00">age&gt;10</text>
-<text text-anchor="start" x="586.66" y="-1626.8" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;4</text>
+<polygon fill="none" stroke="black" points="421.04,-702.4 351.39,-684.4 421.04,-666.4 490.69,-684.4 421.04,-702.4"/>
+<text text-anchor="start" x="393.38" y="-681.2" font-family="Times,serif" font-size="14.00">age&gt;10</text>
+<text text-anchor="start" x="434.7" y="-681.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;4</text>
 </g>
 <!-- int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge50" class="edge">
+<g id="edge15" class="edge">
 <title>int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M573,-1684.81C573,-1676.79 573,-1667.05 573,-1658.07"/>
-<polygon fill="black" stroke="black" points="576.5,-1658.03 573,-1648.03 569.5,-1658.03 576.5,-1658.03"/>
-</g>
-<!-- System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt; -->
-<g id="node39" class="node">
-<title>System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="641.79,-1505.2 428.21,-1505.2 428.21,-1469.2 641.79,-1469.2 641.79,-1505.2"/>
-<text text-anchor="start" x="436.36" y="-1484" font-family="Times,serif" font-size="14.00">System.out.println(&quot;年龄太大&quot;);</text>
-<text text-anchor="start" x="619.64" y="-1484" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;5</text>
+<path fill="none" stroke="black" d="M421.04,-739.21C421.04,-731.19 421.04,-721.45 421.04,-712.47"/>
+<polygon fill="black" stroke="black" points="424.54,-712.43 421.04,-702.43 417.54,-712.43 424.54,-712.43"/>
 </g>
 <!-- age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge51" class="edge">
+<g id="edge16" class="edge">
 <title>age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M568.64,-1612.85C562.22,-1589.05 550.13,-1544.25 542.32,-1515.34"/>
-<polygon fill="black" stroke="black" points="545.65,-1514.22 539.66,-1505.48 538.89,-1516.04 545.65,-1514.22"/>
-<text text-anchor="middle" x="574.88" y="-1581.4" font-family="Times,serif" font-size="14.00">true</text>
+<path fill="none" stroke="black" d="M416.68,-667.25C410.26,-643.45 398.17,-598.65 390.36,-569.74"/>
+<polygon fill="black" stroke="black" points="393.69,-568.62 387.7,-559.88 386.93,-570.44 393.69,-568.62"/>
+<text text-anchor="middle" x="422.92" y="-635.8" font-family="Times,serif" font-size="14.00">true</text>
 </g>
 <!-- age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt; -->
-<g id="node40" class="node">
+<g id="node16" class="node">
 <title>age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="665,-1559.2 595.35,-1541.2 665,-1523.2 734.65,-1541.2 665,-1559.2"/>
-<text text-anchor="start" x="637.34" y="-1538" font-family="Times,serif" font-size="14.00">age&gt;20</text>
-<text text-anchor="start" x="678.66" y="-1538" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;7</text>
+<polygon fill="none" stroke="black" points="513.04,-613.6 443.39,-595.6 513.04,-577.6 582.69,-595.6 513.04,-613.6"/>
+<text text-anchor="start" x="485.38" y="-592.4" font-family="Times,serif" font-size="14.00">age&gt;20</text>
+<text text-anchor="start" x="526.7" y="-592.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;7</text>
 </g>
 <!-- age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge52" class="edge">
+<g id="edge17" class="edge">
 <title>age&gt;10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;4&lt;/font&gt;&lt;/i&gt;&#45;&gt;age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M587.38,-1615.44C602.36,-1601.3 626.03,-1578.96 643.3,-1562.68"/>
-<polygon fill="black" stroke="black" points="645.85,-1565.08 650.73,-1555.67 641.05,-1559.98 645.85,-1565.08"/>
-<text text-anchor="middle" x="641.21" y="-1581.4" font-family="Times,serif" font-size="14.00">false</text>
-</g>
-<!-- System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge53" class="edge">
-<title>System.out.println(&quot;&#24180;&#40836;&#22826;&#22823;&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;5&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M535.83,-1469.03C537.39,-1453.49 541.77,-1430.75 554,-1415.2 569.36,-1395.67 593.82,-1382.23 614.58,-1373.65"/>
-<polygon fill="black" stroke="black" points="616.07,-1376.82 624.12,-1369.93 613.53,-1370.3 616.07,-1376.82"/>
+<path fill="none" stroke="black" d="M435.41,-669.84C450.4,-655.7 474.07,-633.36 491.34,-617.08"/>
+<polygon fill="black" stroke="black" points="493.89,-619.48 498.77,-610.07 489.09,-614.38 493.89,-619.48"/>
+<text text-anchor="middle" x="488.25" y="-635.8" font-family="Times,serif" font-size="14.00">false</text>
 </g>
 <!-- System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;8&lt;/font&gt;&lt;/i&gt; -->
-<g id="node41" class="node">
+<g id="node17" class="node">
 <title>System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;8&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="742.58,-1451.2 563.42,-1451.2 563.42,-1415.2 742.58,-1415.2 742.58,-1451.2"/>
-<text text-anchor="start" x="571.46" y="-1430" font-family="Times,serif" font-size="14.00">System.out.println(&quot;123&quot;);</text>
-<text text-anchor="start" x="720.54" y="-1430" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;8</text>
+<polygon fill="none" stroke="black" points="590.62,-505.6 411.46,-505.6 411.46,-469.6 590.62,-469.6 590.62,-505.6"/>
+<text text-anchor="start" x="419.5" y="-484.4" font-family="Times,serif" font-size="14.00">System.out.println(&quot;123&quot;);</text>
+<text text-anchor="start" x="568.58" y="-484.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;8</text>
 </g>
 <!-- age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;8&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge54" class="edge">
+<g id="edge18" class="edge">
 <title>age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt;&#45;&gt;System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;8&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M663.12,-1523.64C661.25,-1507.03 658.32,-1481.18 656.09,-1461.53"/>
-<polygon fill="black" stroke="black" points="659.54,-1460.89 654.94,-1451.35 652.59,-1461.68 659.54,-1460.89"/>
-<text text-anchor="middle" x="671.88" y="-1483" font-family="Times,serif" font-size="14.00">true</text>
+<path fill="none" stroke="black" d="M511.16,-578.04C509.28,-561.43 506.36,-535.58 504.13,-515.93"/>
+<polygon fill="black" stroke="black" points="507.58,-515.29 502.98,-505.75 500.63,-516.08 507.58,-515.29"/>
+<text text-anchor="middle" x="518.92" y="-537.4" font-family="Times,serif" font-size="14.00">true</text>
 </g>
 <!-- age = 18;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;11&lt;/font&gt;&lt;/i&gt; -->
-<g id="node42" class="node">
+<g id="node18" class="node">
 <title>age = 18;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;11&lt;/font&gt;&lt;/i&gt;</title>
-<polygon fill="none" stroke="black" points="849.71,-1451.2 760.29,-1451.2 760.29,-1415.2 849.71,-1415.2 849.71,-1451.2"/>
-<text text-anchor="start" x="768.39" y="-1430" font-family="Times,serif" font-size="14.00">age = 18;</text>
-<text text-anchor="start" x="820.61" y="-1430" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;11</text>
+<polygon fill="none" stroke="black" points="697.75,-505.6 608.32,-505.6 608.32,-469.6 697.75,-469.6 697.75,-505.6"/>
+<text text-anchor="start" x="616.43" y="-484.4" font-family="Times,serif" font-size="14.00">age = 18;</text>
+<text text-anchor="start" x="668.65" y="-484.4" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;11</text>
 </g>
 <!-- age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt;&#45;&gt;age = 18;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;11&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge55" class="edge">
+<g id="edge19" class="edge">
 <title>age&gt;20&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;7&lt;/font&gt;&lt;/i&gt;&#45;&gt;age = 18;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;11&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M681.89,-1527.41C704.79,-1510.07 746.09,-1478.8 774.5,-1457.29"/>
-<polygon fill="black" stroke="black" points="776.64,-1460.06 782.5,-1451.23 772.42,-1454.48 776.64,-1460.06"/>
-<text text-anchor="middle" x="768.21" y="-1483" font-family="Times,serif" font-size="14.00">false</text>
+<path fill="none" stroke="black" d="M529.93,-581.81C552.83,-564.47 594.13,-533.2 622.54,-511.69"/>
+<polygon fill="black" stroke="black" points="624.68,-514.46 630.54,-505.63 620.46,-508.88 624.68,-514.46"/>
+<text text-anchor="middle" x="616.25" y="-537.4" font-family="Times,serif" font-size="14.00">false</text>
 </g>
 <!-- System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;8&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge56" class="edge">
+<g id="edge20" class="edge">
 <title>System.out.println(&quot;123&quot;);&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;8&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M653,-1415.01C653,-1406.99 653,-1397.25 653,-1388.27"/>
-<polygon fill="black" stroke="black" points="656.5,-1388.23 653,-1378.23 649.5,-1388.23 656.5,-1388.23"/>
+<path fill="none" stroke="black" d="M501.04,-469.41C501.04,-461.39 501.04,-451.65 501.04,-442.67"/>
+<polygon fill="black" stroke="black" points="504.54,-442.63 501.04,-432.63 497.54,-442.63 504.54,-442.63"/>
 </g>
 <!-- age = 18;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;11&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt; -->
-<g id="edge57" class="edge">
+<g id="edge21" class="edge">
 <title>age = 18;&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;11&lt;/font&gt;&lt;/i&gt;&#45;&gt;i&lt;12&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;13&lt;/font&gt;&lt;/i&gt;</title>
-<path fill="none" stroke="black" d="M768.59,-1415.19C743.01,-1403.24 709.11,-1387.41 684.65,-1375.98"/>
-<polygon fill="black" stroke="black" points="685.99,-1372.75 675.45,-1371.69 683.03,-1379.09 685.99,-1372.75"/>
+<path fill="none" stroke="black" d="M616.63,-469.59C591.04,-457.64 557.15,-441.81 532.69,-430.38"/>
+<polygon fill="black" stroke="black" points="534.03,-427.15 523.49,-426.09 531.07,-433.49 534.03,-427.15"/>
+</g>
+<!-- Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt; -->
+<g id="node19" class="node">
+<title>Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M498.82,-848.4C498.82,-848.4 343.25,-848.4 343.25,-848.4 337.25,-848.4 331.25,-842.4 331.25,-836.4 331.25,-836.4 331.25,-824.4 331.25,-824.4 331.25,-818.4 337.25,-812.4 343.25,-812.4 343.25,-812.4 498.82,-812.4 498.82,-812.4 504.82,-812.4 510.82,-818.4 510.82,-824.4 510.82,-824.4 510.82,-836.4 510.82,-836.4 510.82,-842.4 504.82,-848.4 498.82,-848.4"/>
+<text text-anchor="start" x="339.4" y="-827.2" font-family="Times,serif" font-size="14.00">Person#main(String[]args)</text>
+<text text-anchor="start" x="488.68" y="-827.2" font-family="Times,serif" font-style="italic" font-size="14.00" fill="gray"> &#160;2</text>
+</g>
+<!-- Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt;&#45;&gt;int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt; -->
+<g id="edge22" class="edge">
+<title>Person#main(String[]args)&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;2&lt;/font&gt;&lt;/i&gt;&#45;&gt;int age = 10&lt;i&gt;&lt;font color=&quot;gray&quot;&gt; &#160;3&lt;/font&gt;&lt;/i&gt;</title>
+<path fill="none" stroke="black" d="M421.04,-812.21C421.04,-804.19 421.04,-794.45 421.04,-785.47"/>
+<polygon fill="black" stroke="black" points="424.54,-785.43 421.04,-775.43 417.54,-785.43 424.54,-785.43"/>
 </g>
 </g>
 </svg>

+ 1 - 6
pom.xml

@@ -13,7 +13,7 @@
         <module>aidl-to-json</module>
         <module>map-to-json</module>
         <module>flowchart</module>
-        <module>antlr4-utils</module>
+        <module>util</module>
     </modules>
     <dependencies>
         <dependency>
@@ -21,11 +21,6 @@
             <artifactId>antlr4</artifactId>
             <version>4.9.2</version>
         </dependency>
-        <dependency>
-            <groupId>xyz.ignatz</groupId>
-            <artifactId>antlr4-utils</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
     </dependencies>
 
     <properties>

+ 1 - 1
antlr4-utils/pom.xml → util/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>antlr4-utils</artifactId>
+    <artifactId>util</artifactId>
 
     <properties>
         <maven.compiler.source>8</maven.compiler.source>

+ 1 - 0
antlr4-utils/src/main/java/xyz/ignatz/antlr4/Utils.java → util/src/main/java/xyz/ignatz/antlr4/Utils.java

@@ -1,5 +1,6 @@
 package xyz.ignatz.antlr4;
 
+
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.misc.Interval;
 

+ 35 - 0
util/src/main/java/xyz/ignatz/utils/Pair.java

@@ -0,0 +1,35 @@
+package xyz.ignatz.utils;
+
+import java.util.Objects;
+
+public class Pair<A, B> {
+
+    public final A fst;
+    public final B snd;
+
+    public Pair(A fst, B snd) {
+        this.fst = fst;
+        this.snd = snd;
+    }
+
+    public String toString() {
+        return "Pair[" + fst + "," + snd + "]";
+    }
+
+    public boolean equals(Object other) {
+        return
+            other instanceof Pair<?,?> &&
+            Objects.equals(fst, ((Pair<?,?>)other).fst) &&
+            Objects.equals(snd, ((Pair<?,?>)other).snd);
+    }
+
+    public int hashCode() {
+        if (fst == null) return (snd == null) ? 0 : snd.hashCode() + 1;
+        else if (snd == null) return fst.hashCode() + 2;
+        else return fst.hashCode() * 17 + snd.hashCode();
+    }
+
+    public static <A,B> Pair<A,B> of(A a, B b) {
+        return new Pair<>(a,b);
+    }
+}