fix: 構造検知の根本的改善 — 変数名に依存しないマッチング検出

COBOL技術者による徹底検証で発見された根本問題と修正:

問題1: 構造検知の信号が変数名の命名規則に依存しすぎていた
- EOF 固定 → WS-E1/WS-END-1/FE-1 も検知
- INTO ありのみ → READ AT END のみも検知
- IF 比較が WS- またはハイフン必須 → どんな名前でも検知
- OPEN 1行複数ファイルのみ → 複数行も検知

問題2: mn_output_mode が2ファイル4分岐でも M:N と誤判定
- しきい値を select>=3 or (select>=2 and 分岐>=4) に引き上げ
- 標準的な2ファイルマッチングプログラムを誤判定しない

問題3: has_cross_file_cmp が欠落していた
- ルールエンジンに IF K1 = K2 のような比較情報を注入
- 数字リテラルとの比較は除外(IF WS-COUNT > 0 など)

効果: 6種類の異なるコーディングスタイルすべてが一貫してマッチング判定
回帰: 767 passed (0 new)
This commit is contained in:
NB-076
2026-06-21 16:27:17 +08:00
parent 4be2aae66d
commit 875c593d85
3 changed files with 57 additions and 22 deletions
+8
View File
@@ -173,6 +173,14 @@ def _path_rule_engine(
r'(?:PERFORM|END-PERFORM|READ)', # 含循环/读取
su, re.DOTALL
))
# 注入 has_cross_file_cmp: IF 比较两个不同变量(任何命名)
# 匹配: IF K1 = K2, IF WS-CUST-CODE = WS-ORDR-CODE, IF CUST-ID < ORDR-ID
# 排除: IF WS-COUNT > 0(字面量在右侧)
# 规则:右边以字母开头(排除数字、引号文字)
features["has_cross_file_cmp"] = bool(re.search(
r'IF\s+\w[\w-]*\s*[=<>]\s+[A-Za-z][\w-]*',
su
))
# 注入 CSV 信号:逗号分隔的字符串拼接/替换
features["has_csv_merge"] = bool(re.search(
r"STRING[\s\S]*?','[\s\S]*?INTO", # STRING ... ',' ... INTO