R13: final sweep — EXEC stripping + INSPECT bugfix + more EQ assertions

1. Lark: preprocess strips EXEC CICS/SQL...END-EXEC blocks
   -> CI01_CICS/DB01_SELECT_UPDATE now parse, 75/75 samples pass
2. propagate_assignments INSPECT TALLYING bugfix:
   was reading source from count_var (wrong field) instead of
   asgn['tgt']. Now CNT='005' instead of '003' for len(HELLO)=5.
3. 26 new EQ/falsifiable assertions added (propagate chains,
   orchestrator state, data_writer, report generator)
4. Hardened: ACCEPT DATE string len check, DataWriter JSON format

16 suites / 0 FAIL.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
NB-076
2026-06-22 09:37:58 +08:00
parent 58816799d4
commit abb283669c
4 changed files with 214 additions and 3 deletions
+3 -1
View File
@@ -1417,7 +1417,9 @@ def propagate_assignments(rec, assignments, fields, file_sec=None):
resolved_tgt = _resolve_subscript(tgt, rec)
if resolved_tgt not in rec:
continue
src_val = str(rec[resolved_tgt])
inspect_src = asgn.get('tgt', tgt)
resolved_src = _resolve_subscript(inspect_src, rec)
src_val = str(rec.get(resolved_src, ''))
for op_type, params in asgn.get('sub_ops', []):
if op_type == 'tally':
cv = params['count_var'].upper()
+7
View File
@@ -31,6 +31,13 @@ def preprocess(source: str) -> str:
# Lark 语法不支持 COPY(这是预处理指令),必须在解析前处理
source = resolve_copybooks(source, '.')
# Strip EXEC ... END-EXEC blocks (CICS/SQL) before Lark parsing
source = re.sub(
r'EXEC\s+(?:CICS|SQL)\b.*?END-EXEC\.?',
'',
source, flags=re.IGNORECASE | re.DOTALL
)
fixed = _is_fixed_format(source)
lines = []
for raw_line in source.splitlines():