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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user