我正在为一些 COBOL 代码构建一个控制流程图作为练习。 对于这个问题,我考虑以下代码:
IDENTIFICATION DIVISION.PROGRAM-ID. IRREDUCIBLE-TEST.
AUTHOR. MOJO.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TESTING PIC 9(8) VALUE 100.
PROCEDURE DIVISION.
ROOT SECTION.
PERFORM MAIN-SECTION-01.
STOP RUN.
MAIN-SECTION-01 SECTION.
MAIN-SECTION-01-A.
IF TESTING = 5
GO TO MAIN-SECTION-01-Z.
PERFORM SUBROUTINE-1.
MAIN-SECTION-01-Z.
EXIT.
SUBROUTINE-1 SECTION.
SUBROUTINE-1-A.
EXIT.
从目视检查可以清楚地看出,执行
MAIN-SECTION-01
后控制流不会失败(即,SUBROUTINE-1
退出后不执行MAIN-SECTION-01
),因为MAIN-SECTION-01
是通过PERFORM调用的。
然而,不加区别地连接从句法角度来看连续的部分(如 MAIN-SECTION-01
到 SUBROUTINE-1
)会导致不可约的流程图(使用 T1-T2 变换),如下所示:
我的问题是:是否有合理的启发式或图论基础来明确确定一个部分是否不属于下一个部分?我知道,由于基于计算条件的决策,总会存在没有明确是/否答案的情况,但在没有歧义的情况下(如上面的程序),合理的方法是什么?
我非常感谢任何有关我可以自己探索的相关技术的指示。
我规避此问题的一种方法是让开发人员明确指定哪些部分/段落没有传入的失败连接。这可行,但我更乐意自动化(某些)决策。
如果您“落入”某个部分或“转到”某个部分,则代码将落入下一个段落或部分。
基本上,除非您“执行”一个部分,否则不会发生隐式退出,并且控制权会落到下一段。