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,19 @@
* ==== TYPE: ST-INI-MULTI ====
* FEATURE: INITIALIZE multiple fields
* STATEMENT: INITIALIZE
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. INIMUL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(10) VALUE 'HELLO'.
01 WS-COUNT PIC 9(5) VALUE 12345.
01 WS-FLAG PIC X VALUE 'Y'.
PROCEDURE DIVISION.
MAIN.
INITIALIZE WS-NAME WS-COUNT WS-FLAG.
IF WS-NAME = SPACES
DISPLAY 'OK: INITIALIZE NAME'
ELSE
DISPLAY 'ERROR: INITIALIZE'.
STOP RUN.
@@ -0,0 +1,20 @@
* ==== TYPE: ST-INI-REPLACE ====
* FEATURE: INITIALIZE with REPLACING clause
* STATEMENT: INITIALIZE REPLACING
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. INIREP.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-AMOUNT PIC 9(5) VALUE 99999.
01 WS-CODE PIC X(5) VALUE 'XXXXX'.
PROCEDURE DIVISION.
MAIN.
INITIALIZE WS-AMOUNT WS-CODE
REPLACING NUMERIC DATA BY 1
ALPHANUMERIC DATA BY 'A'.
IF WS-AMOUNT = 1
DISPLAY 'OK: REPLACE NUMERIC'
ELSE
DISPLAY 'ERROR: REPLACE'.
STOP RUN.
@@ -0,0 +1,22 @@
* ==== TYPE: ST-MOVE-GROUP ====
* FEATURE: MOVE group-level (data propagation)
* STATEMENT: MOVE (group)
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. MOVGRP.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SOURCE.
05 WS-SRC-ID PIC X(5) VALUE 'ITEM1'.
05 WS-SRC-AMT PIC 9(5) VALUE 9999.
01 WS-DEST.
05 WS-DST-ID PIC X(5).
05 WS-DST-AMT PIC 9(5).
PROCEDURE DIVISION.
MAIN.
MOVE WS-SOURCE TO WS-DEST.
IF WS-DST-ID = 'ITEM1'
DISPLAY 'OK: GROUP MOVE ID'
ELSE
DISPLAY 'ERROR: GROUP MOVE'.
STOP RUN.
@@ -0,0 +1,26 @@
* ==== TYPE: ST-STRING-DELIM ====
* FEATURE: STRING with DELIMITED BY / SIZE
* STATEMENT: STRING
* BRANCHES: 0, DECISIONS: 0
* NOTE: STRING is pass-through; no IF
IDENTIFICATION DIVISION.
PROGRAM-ID. STRDEL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-PART1 PIC X(5) VALUE 'ALPHA'.
01 WS-PART2 PIC X(4) VALUE 'BETA'.
01 WS-RESULT PIC X(50).
01 WS-ptr PIC 9(3) VALUE 1.
PROCEDURE DIVISION.
MAIN.
MOVE SPACES TO WS-RESULT.
MOVE 1 TO WS-ptr.
STRING WS-PART1 DELIMITED BY SPACES
',' DELIMITED BY SIZE
WS-PART2 DELIMITED BY SPACES
INTO WS-RESULT WITH POINTER WS-ptr.
IF WS-RESULT(1:10) = 'ALPHA,BETA'
DISPLAY 'OK: STRING'
ELSE
DISPLAY 'ERROR: STRING'.
STOP RUN.
@@ -0,0 +1,23 @@
* ==== TYPE: ST-UNSTRING-BASIC ====
* FEATURE: UNSTRING space-delimited into multiple fields
* STATEMENT: UNSTRING
* BRANCHES: 0, DECISIONS: 0
* NOTE: UNSTRING is pass-through; no IF
IDENTIFICATION DIVISION.
PROGRAM-ID. UNSBAS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SRC PIC X(20) VALUE 'ABC DEF GHI'.
01 WS-A PIC X(5).
01 WS-B PIC X(5).
01 WS-C PIC X(5).
PROCEDURE DIVISION.
MAIN.
MOVE SPACES TO WS-A WS-B WS-C.
UNSTRING WS-SRC DELIMITED BY SPACES
INTO WS-A WS-B WS-C.
IF WS-A = 'ABC'
DISPLAY 'OK: UNSTRING'
ELSE
DISPLAY 'ERROR: UNSTRING'.
STOP RUN.