java9-flowchart.md 3.0 KB

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<Block>,即visit函数返回BlockBlock维护一个子图。我们需要对每条规则设计正确的Block生成方式。规则分类如下(未列出的规则默认返回defaultResult() -> null):

      1. 原子单位:直接返回Block,不再向下递归,有localVariableDeclaration, statementExpressionList, emptyStatement, expressionStatement, assertStatement, breakStatement, continueStatement, returnStatement
      2. 顺序结构:顺序结构的出现可能很多,但我们只需要重载aggregateResult(aggregate, next)函数为以顺序结构的方式连接两个Block即可;
      3. 分支结构:含ifswitch的规则。需要使用正确的方式连接一个判断Block和一或多个分支Block;
      4. 循环结构:含forwhile的规则。在分支结构的基础上,再增加一条边形成循环即可。
    • Blocks 提供更多构造Block的工厂方法。 用于精简Java9FlowchartVisitor中重复代码。

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

    • resource

    • grammar 存放Java9.g4

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

    • java

      • Node

      • 代表流程图的一个节点,成员有:

        • label 节点的标签;
        • line 行号;
        • Map<String, Node> links存储转移边。
        • 仅允许在构造时定义出边,默认指向null,称为空边。
        • 后续仅允许设置空边的指向。
        • 仅允许Block操作,对Java9FlowchartVisitor透明。
      • Block

      • 代表一个子流程图,负责实现块连接的基本操作,成员有:

        • start 入口节点;
        • nullLinks 空边表,空边有分类,分类不固定,可修改,初始为边的标记。
      • 块连接

        • 为了保证效率,每次块连接从空边表中查找边,设置完后删去;
        • 另外还有修改边分类的操作modifyLinkType