java9-flowchart.md 2.5 KB

java9-flowchart

简介

此程序能够绘制简单的java9程序的程序流程图。

使用ANTLR4生成语法分析树,编写Visitor获得流程图结构,使用graphviz-java绘制流程图。

仅支持普通的ifswitchforwhiledo while结构。

结构

  • java9-flowchart 此部分负责将java9程序转化为流程图。

    • Java9FlowchartGenerator

    程序主体,输入文件名和输出路径,输出图片。程序整体结构如下:

    1. 调用ANTLR4将Java9程序转换为语法树;
    2. 使用Java9FlowchartVisitor遍历语法树,每个方法构造一个流程图Flowchart
    3. Flowchart生成graphviz-java的Graph
    4. 生成对应的流程图。
    • recognizer:此部分负责分析Java语法。

    • ANTLR4根据Java9.g4生成的基本分析器。

    • Java9FlowchartVisitor

      • 负责:
      • 记录每个方法的名字,并分别构造流程图Flowchart
      • 调用Blocks中的方法转换不同的Context为子图Block,规则分类如下:
        1. 原子单位:作为一个节点Node,有localVariableDeclaration, statementExpressionList, emptyStatement, expressionStatement, assertStatement, breakStatement, continueStatement, returnStatement
        2. 顺序结构:重载aggregateResult(aggregate, next)函数为顺序连接两个Block
        3. 分支结构:含ifswitch的规则;
        4. 循环结构:含forwhile的规则。
        5. 命名语句:指影响当前方法名的语句,包括classinterfacemethod声明语句。
    • Blocks 负责构造Block以及处理顺序、分支、循环的Block的连接。

    • JavaName 用于维护当前访问位置所在class/method

  • flowchart

此部分为存储流程图的数据结构

  • Node
    • 代表流程图的一个节点,成员有:
      • label 节点的标签;
      • line 行号;
      • Map<String, Node> links 边表。
      • 构造时定义出边,可以为空边指向null
  • Block
    • 代表一个子流程图,负责实现块连接的基本操作,成员有:
      • start 入口节点;
      • Map<String, NullLink> nullLinks 分类空边表;
      • NullLink为单向环链,确保修改分类时的时间复杂度;
      • move方法用于修改空边分类。
  • Factory包含Block的工厂函数。
  • Flowchart负责通过Block建graphviz-java的Graph

代码