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,21 @@
* ==== TYPE: ST-ADD-GIVING ====
* FEATURE: ADD ... GIVING (single and multi-source)
* STATEMENT: ADD
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. ADDGIV.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9(5) VALUE 30.
01 WS-B PIC 9(5) VALUE 20.
01 WS-SUM PIC 9(5) VALUE 0.
01 WS-TOTAL PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
ADD 10 TO WS-A GIVING WS-SUM.
ADD WS-A WS-B GIVING WS-TOTAL.
IF WS-TOTAL = 60
DISPLAY 'OK: 30+10+20=60'
ELSE
DISPLAY 'ERROR: WRONG SUM'.
STOP RUN.
@@ -0,0 +1,20 @@
* ==== TYPE: ST-ADD-ROUNDED ====
* FEATURE: ADD ROUNDED
* STATEMENT: ADD ROUNDED
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. ADDRND.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAL1 PIC 9(3)V99 VALUE 100.50.
01 WS-VAL2 PIC 9(3)V99 VALUE 200.75.
01 WS-RESULT PIC 9(3)V99 VALUE 0.
01 WS-CHECK PIC 9(3)V99 VALUE 301.25.
PROCEDURE DIVISION.
MAIN.
ADD WS-VAL1 TO WS-VAL2 GIVING WS-RESULT ROUNDED.
IF WS-RESULT = WS-CHECK
DISPLAY 'OK: 100.50+200.75=301.25'
ELSE
DISPLAY 'ERROR: WRONG SUM'.
STOP RUN.
@@ -0,0 +1,21 @@
* ==== TYPE: ST-ADD-TO ====
* FEATURE: ADD x TO y (constant / variable)
* STATEMENT: ADD
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. ADDTO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VALUE PIC 9(5) VALUE 100.
01 WS-RESULT PIC 9(5) VALUE 0.
01 WS-DELTA PIC 9(5) VALUE 25.
PROCEDURE DIVISION.
MAIN.
ADD 50 TO WS-VALUE.
MOVE WS-VALUE TO WS-RESULT.
ADD WS-DELTA TO WS-RESULT.
IF WS-RESULT = 175
DISPLAY 'OK: 100+50+25=175'
ELSE
DISPLAY 'ERROR: WRONG VALUE'.
STOP RUN.
@@ -0,0 +1,26 @@
* ==== TYPE: ST-COMPLEX ====
* FEATURE: COMPUTE with multiple operators
* STATEMENT: COMPUTE
* BRANCHES: 4, DECISIONS: 2
IDENTIFICATION DIVISION.
PROGRAM-ID. COMPLX.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-X PIC 9(5) VALUE 10.
01 WS-Y PIC 9(5) VALUE 20.
01 WS-Z PIC 9(5) VALUE 5.
01 WS-R1 PIC 9(5) VALUE 0.
01 WS-R2 PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
COMPUTE WS-R1 = WS-X + WS-Y.
COMPUTE WS-R2 = (WS-Y - WS-X) * WS-Z.
IF WS-R1 = 30
DISPLAY 'OK: R1=30'
ELSE
DISPLAY 'ERROR: R1'.
IF WS-R2 = 50
DISPLAY 'OK: R2=50'
ELSE
DISPLAY 'ERROR: R2'.
STOP RUN.
@@ -0,0 +1,25 @@
* ==== TYPE: ST-DIV-BY-GIVING ====
* FEATURE: DIVIDE ... BY ... GIVING ... REMAINDER
* STATEMENT: DIVIDE BY GIVING
* BRANCHES: 4, DECISIONS: 2
IDENTIFICATION DIVISION.
PROGRAM-ID. DIVBYG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9(5) VALUE 100.
01 WS-B PIC 9(5) VALUE 30.
01 WS-RESULT PIC 9(5) VALUE 0.
01 WS-REM PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
DIVIDE WS-A BY WS-B GIVING WS-RESULT
REMAINDER WS-REM.
IF WS-RESULT = 3
DISPLAY 'OK: QUOTIENT=3'
ELSE
DISPLAY 'ERROR: QUOTIENT'.
IF WS-REM = 10
DISPLAY 'OK: REMAINDER=10'
ELSE
DISPLAY 'ERROR: REMAINDER'.
STOP RUN.
@@ -0,0 +1,19 @@
* ==== TYPE: ST-MUL-BY ====
* FEATURE: MULTIPLY ... BY (constant)
* STATEMENT: MULTIPLY
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. MULBY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-AMOUNT PIC 9(5) VALUE 50.
01 WS-RESULT PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
MULTIPLY 3 BY WS-AMOUNT.
MOVE WS-AMOUNT TO WS-RESULT.
IF WS-RESULT = 150
DISPLAY 'OK: 50*3=150'
ELSE
DISPLAY 'ERROR'.
STOP RUN.
@@ -0,0 +1,19 @@
* ==== TYPE: ST-MUL-GIVING ====
* FEATURE: MULTIPLY ... BY ... GIVING
* STATEMENT: MULTIPLY GIVING
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. MULGIV.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9(5) VALUE 7.
01 WS-B PIC 9(5) VALUE 8.
01 WS-RESULT PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
MULTIPLY WS-A BY WS-B GIVING WS-RESULT.
IF WS-RESULT = 56
DISPLAY 'OK: 7*8=56'
ELSE
DISPLAY 'ERROR'.
STOP RUN.
@@ -0,0 +1,19 @@
* ==== TYPE: ST-SUB-FROM ====
* FEATURE: SUBTRACT ... FROM (constant / variable)
* STATEMENT: SUBTRACT
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBFRM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VALUE PIC 9(5) VALUE 100.
01 WS-RESULT PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
SUBTRACT 30 FROM WS-VALUE.
MOVE WS-VALUE TO WS-RESULT.
IF WS-RESULT = 70
DISPLAY 'OK: 100-30=70'
ELSE
DISPLAY 'ERROR'.
STOP RUN.
@@ -0,0 +1,19 @@
* ==== TYPE: ST-SUB-GIVING ====
* FEATURE: SUBTRACT ... FROM ... GIVING
* STATEMENT: SUBTRACT
* BRANCHES: 2, DECISIONS: 1
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBGIV.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TOTAL PIC 9(5) VALUE 500.
01 WS-PAID PIC 9(5) VALUE 120.
01 WS-BALANCE PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
MAIN.
SUBTRACT WS-PAID FROM WS-TOTAL GIVING WS-BALANCE.
IF WS-BALANCE = 380
DISPLAY 'OK: 500-120=380'
ELSE
DISPLAY 'ERROR'.
STOP RUN.