# java9-flowchart ## 简介 此程序能够绘制简单的java9程序的程序流程图。 使用ANTLR4生成语法分析树,编写Visitor获得流程图结构,使用graphviz-java绘制流程图。 仅支持普通的`if`,`switch`,`for`,`while`,`do while`结构。 ## 结构 - java9-flowchart 此部分负责将java9程序转化为流程图。 - `Java9FlowchartGenerator` 程序主体,输入文件名和输出路径,输出图片。程序整体结构如下: 1. 调用ANTLR4将Java9程序转换为语法树; 2. 使用`Java9FlowchartVisitor`遍历语法树,每个方法构造一个流程图`Flowchart`; 3. `Flowchart`生成graphviz-java的`Graph`; 4. 生成对应的流程图。 - 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`的连接。 - `JavaName` 用于维护当前访问位置所在`class`/`method`。 - flowchart 此部分为存储流程图的数据结构 - `Node` - 代表流程图的一个节点,成员有: - `label` 节点的标签; - `line` 行号; - `Map links` 边表。 - 构造时定义出边,可以为空边指向`null`。 - `Block` - 代表一个子流程图,负责实现块连接的基本操作,成员有: - `start` 入口节点; - `Map nullLinks` 分类空边表; - `NullLink`为单向环链,确保修改分类时的时间复杂度; - `move`方法用于修改空边分类。 - `Factory`包含`Block`的工厂函数。 - `Flowchart`负责通过`Block`建graphviz-java的`Graph`。 ## 代码