feat: add COBOL statement benchmark plan and 34 P0 sample programs

- docs/cobol-statement-benchmark-plan.md — full coverage matrix and gap analysis
- 34 P0 COBOL samples: arithmetic(9), move(5), file(6), control(6),
  inspect(3), search(2), perform(3)
- test-data/validate_statements.py — automatic validation script
- Validation: 34/34 samples pass preprocess + extract_structure
This commit is contained in:
NB-076
2026-06-21 12:02:25 +08:00
parent a6c454692a
commit 8c1f9114f6
36 changed files with 1626 additions and 0 deletions
@@ -0,0 +1,32 @@
* ==== TYPE: ST-DELETE ====
* FEATURE: DELETE file record with INVALID KEY
* STATEMENT: DELETE
* BRANCHES: 2, DECISIONS: 1
* NOTE: DELETE INVALID KEY is pass-through; only IF counts
IDENTIFICATION DIVISION.
PROGRAM-ID. DELFIL.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-A ASSIGN TO 'FILEA.DAT'
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC.
DATA DIVISION.
FILE SECTION.
FD FILE-A.
01 REC-A PIC X(80).
WORKING-STORAGE SECTION.
01 WS-KEY PIC X(10) VALUE 'KEY001'.
PROCEDURE DIVISION.
MAIN.
OPEN I-O FILE-A.
MOVE WS-KEY TO REC-A.
DELETE FILE-A
INVALID KEY DISPLAY 'KEY NOT FOUND'
NOT INVALID KEY DISPLAY 'OK: DELETED'.
CLOSE FILE-A.
IF WS-KEY = 'KEY001'
DISPLAY 'OK: DELETE DONE'
ELSE
DISPLAY 'ERROR: DELETE'.
STOP RUN.
@@ -0,0 +1,30 @@
* ==== TYPE: ST-READ-AT-END ====
* FEATURE: READ with AT END / NOT AT END
* STATEMENT: READ AT END
* BRANCHES: 0, DECISIONS: 0
* NOTE: READ AT END is pass-through; no IF
IDENTIFICATION DIVISION.
PROGRAM-ID. READAE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO 'INDATA.DAT'.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-STATUS PIC X VALUE 'N'.
01 WS-DATA PIC X(80).
PROCEDURE DIVISION.
MAIN.
OPEN INPUT IN-FILE.
READ IN-FILE INTO WS-DATA
AT END MOVE 'Y' TO WS-STATUS
NOT AT END MOVE 'N' TO WS-STATUS.
IF WS-STATUS = 'Y'
DISPLAY 'OK: AT END REACHED'
ELSE
DISPLAY 'OK: DATA READ'.
CLOSE IN-FILE.
STOP RUN.
@@ -0,0 +1,33 @@
* ==== TYPE: ST-READ-INTO ====
* FEATURE: READ ... INTO with multiple fields
* STATEMENT: READ INTO
* BRANCHES: 0, DECISIONS: 0
* NOTE: READ INTO is pass-through; no IF
IDENTIFICATION DIVISION.
PROGRAM-ID. READIN.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO 'INDATA.DAT'.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-ID PIC X(5).
05 IN-AMT PIC 9(5).
WORKING-STORAGE SECTION.
01 WS-REC.
05 WS-ID PIC X(5).
05 WS-AMT PIC 9(5).
01 WS-EOF PIC X VALUE 'N'.
PROCEDURE DIVISION.
MAIN.
OPEN INPUT IN-FILE.
READ IN-FILE INTO WS-REC
AT END MOVE 'Y' TO WS-EOF.
IF WS-EOF = 'N'
DISPLAY 'OK: READ INTO'
ELSE
DISPLAY 'EOF'.
CLOSE IN-FILE.
STOP RUN.
@@ -0,0 +1,27 @@
* ==== TYPE: ST-REWRITE-FROM ====
* FEATURE: REWRITE ... FROM
* STATEMENT: REWRITE FROM
* BRANCHES: 0, DECISIONS: 0
* NOTE: REWRITE FROM is pass-through; no IF
IDENTIFICATION DIVISION.
PROGRAM-ID. REWFRM.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-A ASSIGN TO 'FILEA.DAT'
ORGANIZATION IS INDEXED
ACCESS IS RANDOM.
DATA DIVISION.
FILE SECTION.
FD FILE-A.
01 REC-A PIC X(80).
WORKING-STORAGE SECTION.
01 WS-UPD PIC X(80) VALUE 'UPDATED'.
PROCEDURE DIVISION.
MAIN.
OPEN I-O FILE-A.
MOVE WS-UPD TO REC-A.
REWRITE REC-A FROM WS-UPD.
CLOSE FILE-A.
DISPLAY 'OK: REWRITE FROM'.
STOP RUN.
@@ -0,0 +1,32 @@
* ==== TYPE: ST-START ====
* FEATURE: START with KEY IS
* STATEMENT: START
* BRANCHES: 2, DECISIONS: 1
* NOTE: START INVALID KEY is pass-through; only IF counts
IDENTIFICATION DIVISION.
PROGRAM-ID. STRT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-A ASSIGN TO 'FILEA.DAT'
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC.
DATA DIVISION.
FILE SECTION.
FD FILE-A.
01 REC-A PIC X(80).
WORKING-STORAGE SECTION.
01 WS-KEY PIC X(10) VALUE 'K00050'.
PROCEDURE DIVISION.
MAIN.
OPEN INPUT FILE-A.
MOVE WS-KEY TO REC-A.
START FILE-A KEY IS >= WS-KEY
INVALID KEY DISPLAY 'START FAILED'
NOT INVALID KEY DISPLAY 'OK: START'.
CLOSE FILE-A.
IF WS-KEY > SPACES
DISPLAY 'OK: START DONE'
ELSE
DISPLAY 'ERROR: START'.
STOP RUN.
@@ -0,0 +1,26 @@
* ==== TYPE: ST-WRITE-AFTER ====
* FEATURE: WRITE AFTER/BEFORE ADVANCING
* STATEMENT: WRITE AFTER
* BRANCHES: 0, DECISIONS: 0
* NOTE: WRITE AFTER is pass-through; no IF
IDENTIFICATION DIVISION.
PROGRAM-ID. WRTAFT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUT-FILE ASSIGN TO 'OUTDATA.DAT'.
DATA DIVISION.
FILE SECTION.
FD OUT-FILE.
01 OUT-REC PIC X(50).
WORKING-STORAGE SECTION.
01 WS-DATA PIC X(50) VALUE 'TEST RECORD'.
PROCEDURE DIVISION.
MAIN.
OPEN OUTPUT OUT-FILE.
MOVE WS-DATA TO OUT-REC.
WRITE OUT-REC AFTER ADVANCING 1 LINE.
WRITE OUT-REC BEFORE ADVANCING 2 LINES.
CLOSE OUT-FILE.
DISPLAY 'OK: WRITE AFTER/BEFORE'.
STOP RUN.