# java9-flowchart
## 简介
此程序能够绘制简单的java9程序的程序流程图。
使用ANTLR4生成语法分析树,编写Visitor获得流程图结构,使用graphviz-java绘制流程图。
## 结构
- java9-flowchart
此部分负责将java9程序转化为流程图。
- java
- `Java9FlowchartGenerator`
程序主体,输入文件名和输出路径,输出图片。程序整体结构如下:
1. 调用ANTLR4将Java9程序转换为语法树;
2. 使用`Java9FlowchartVisitor`遍历语法树,建图;
3. `Flowchart`将图翻译为`graphviz-java`需要的形式;
4. 绘制对应的流程图。
- recognizer:此部分负责分析Java语法。
- ANTLR4根据Java9.g4生成的基本分析器。
- `Java9FlowchartVisitor`负责处理`Block`的连接。
继承自`Java9BaseVisitor`,即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`的规则。在分支结构的基础上,再增加一条边形成循环即可。
- `Blocks`
提供更多构造`Block`的工厂方法。
用于精简`Java9FlowchartVisitor`中重复代码。
- `JavaName`
用于维护当前访问位置所在`class`/`method`。
- resource
- grammar
存放Java9.g4
- flowchart
此部分为存储流程图的数据结构
- java
- `Node`
- 代表流程图的一个节点,成员有:
- `label` 节点的标签;
- `line` 行号;
- `Map links`存储转移边。
- **仅允许在构造时定义出边,默认指向`null`,称为空边。**
- **后续仅允许设置空边的指向。**
- **仅允许`Block`操作,对`Java9FlowchartVisitor`透明。**
- `Block`
- 代表一个子流程图,负责实现块连接的基本操作,成员有:
- `start` 入口节点;
- `nullLinks` 空边表,空边有分类,分类不固定,可修改,初始为边的标记。
- 块连接
- 为了保证效率,每次块连接从空边表中查找边,设置完后删去;
- 另外还有修改边分类的操作`modifyLinkType`。