# 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`。