IDENTIFICATION DIVISION. PROGRAM-ID. ProgStructEdge. *> ============================================================ *> 程序構造境界テスト (Program Structure Edge Cases) *> レガシーCOBOL構造: PERFORM THRU, GO TO DEPENDING ON, *> 段落スルー, ALTER(非推奨), 複数SECTION *> ============================================================ ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SWITCH PIC X(1) VALUE 'N'. 88 WS-ON VALUE 'Y'. 01 WS-COUNT PIC 9(5) VALUE 0. 01 WS-GO-TO-IDX PIC 9(1) VALUE 0. 01 WS-PASS PIC 9(2) VALUE 0. 01 WS-FAIL PIC 9(2) VALUE 0. PROCEDURE DIVISION. MAIN. DISPLAY "PROG-STRUCT-EDGE: Program structure edge tests" *> Test 1: PERFORM THRU (段落範囲実行) ADD 1 TO WS-COUNT. DISPLAY "T1-THRU: PERFORM THRU para range" PERFORM PARA-A THRU PARA-C DISPLAY "T1-THRU: PASS" ADD 1 TO WS-PASS. *> Test 2: 段落スルー (Paragraph fall-through) ADD 1 TO WS-COUNT. DISPLAY "T2-FALL: Paragraph fall-through (A->B)" PERFORM PARA-D THRU PARA-E DISPLAY "T2-FALL: PASS" ADD 1 TO WS-PASS. *> Test 3: GO TO DEPENDING ON ADD 1 TO WS-COUNT. DISPLAY "T3-GOTO: GO TO DEPENDING ON" MOVE 0 TO WS-GO-TO-IDX. GO TO PARA-X PARA-Y PARA-Z DEPENDING ON WS-GO-TO-IDX. *> WS-GO-TO-IDX=0 → 次段落へ (何も実行しない) DISPLAY "T3-GOTO: IDX=0 skipped (PASS)" ADD 1 TO WS-PASS. MOVE 2 TO WS-GO-TO-IDX. GO TO PARA-X PARA-Y PARA-Z DEPENDING ON WS-GO-TO-IDX . *> ここには来ない *> Test 4: GO TO (単純) ADD 1 TO WS-COUNT. DISPLAY "T4-GOTO-SIMPLE: Simple GO TO" GO TO PARA-END-T4. DISPLAY "T4-GOTO: FAIL - should not reach" ADD 1 TO WS-FAIL. GO TO PARA-END-T4-EXIT. PARA-END-T4. DISPLAY "T4-GOTO-SIMPLE: PASS" ADD 1 TO WS-PASS. PARA-END-T4-EXIT. CONTINUE. *> Test 5: EXIT PARAGRAPH vs EXIT SECTION ADD 1 TO WS-COUNT. DISPLAY "T5-EXIT: EXIT PARAGRAPH" PERFORM PARA-EXIT-DEMO DISPLAY "T5-EXIT: PASS" ADD 1 TO WS-PASS. *> Test 6: ALTER (非推奨だがレガシーCOBOLに存在) ADD 1 TO WS-COUNT. DISPLAY "T6-ALTER: ALTER (legacy)" ALTER PARA-ALTER-TARGET TO PROCEED TO PARA-ALTER-OK GO TO PARA-ALTER-TARGET. PARA-ALTER-TARGET. DISPLAY "T6-ALTER: FAIL - old path" ADD 1 TO WS-FAIL. GO TO PARA-ALTER-DONE. PARA-ALTER-OK. DISPLAY "T6-ALTER: PASS" ADD 1 TO WS-PASS. PARA-ALTER-DONE. CONTINUE. *> Summary DISPLAY " " DISPLAY "PROG-STRUCT-EDGE: PASS=" WS-PASS " FAIL=" WS-FAIL IF WS-FAIL = 0 DISPLAY "ALL PASSED" STOP RUN RETURNING 0 ELSE STOP RUN RETURNING 1 END-IF . *> === PERFORM THRU 段落群 === PARA-A. DISPLAY " PARA-A: start" . PARA-B. DISPLAY " PARA-B: middle (THRU includes)" . PARA-C. DISPLAY " PARA-C: end (THRU target)" . *> === 段落スルー デモ === PARA-D. DISPLAY " PARA-D: fall through to PARA-E" . PARA-E. DISPLAY " PARA-E: reached via fall-through" . *> === GO TO DEPENDING ON 飛び先 === PARA-X. DISPLAY " PARA-X: IDX=1" . PARA-Y. DISPLAY " PARA-Y: IDX=2" . PARA-Z. DISPLAY " PARA-Z: IDX=3" . *> === EXIT PARAGRAPH デモ === PARA-EXIT-DEMO. DISPLAY " Before EXIT PARAGRAPH" IF WS-PASS >= 0 EXIT PARAGRAPH END-IF DISPLAY " After EXIT PARAGRAPH (NOT reached)" . END PROGRAM ProgStructEdge.