feat(phi): Phase 27.5 - JoinIR Exit φ 統合(LoopExitShape 雛形)

LoopExitShape 構造体を追加し、Exit φ の意味を JoinIR 側に固定:

- LoopExitShape 追加 (src/mir/join_ir.rs:84-111)
  - exit_args: Vec<ValueId> で Exit φ の意味を表現
  - minimal (exit_args=[i]), trim (exit_args=[e], Option A)
  - #[allow(dead_code)] で Phase 27.6 まで設計専用

- Exit φ コメント追加
  - lower_skip_ws_to_joinir: 2箇所の exit パスに意味明記
  - lower_funcscanner_trim_to_joinir: Option A として意味明記

- テストコメント更新
  - mir_joinir_skip_ws.rs: Exit φ (i の合流) 検証を明記
  - mir_joinir_funcscanner_trim.rs: Exit φ (e の合流+substring) を明記

- ドキュメント更新
  - IMPLEMENTATION_LOG.md: Phase 27.5 セクション追加
  - TASKS.md: Phase 27.5 完了マーク

ExitPhiBuilder は Phase 27.6 まで保留。本線影響ゼロ。
This commit is contained in:
nyash-codex
2025-11-23 11:03:38 +09:00
parent 0d3d6cc455
commit 4fd74f2a6e
5 changed files with 123 additions and 7 deletions

View File

@ -15,6 +15,11 @@
// - NYASH_JOINIR_HEADER_EXP=1 を併用すると Header φ bypass が有効化される
// - bypass 時は MIR に Header φ が生成されないが、このテストでは JoinIR のみ検証するため問題なし
// - 将来的に JoinIR runner 実行を追加する際は、bypass モードでも正しく動作することを確認する
//
// Phase 27.5 対応:
// - このテストは Header φ だけでなく、Exit φe の合流substring(b, e) 呼び出し)も JoinIR で k_exit として表現できることを検証
// - trim のループには2箇所の break パスがあり、どちらも substring(b, e) の結果を返す
// - ExitShape Option A として設計: exit_args = [e] で、ループ内で substring(b, e) を計算済み
use crate::ast::ASTNode;
use crate::mir::join_ir::*;

View File

@ -15,6 +15,10 @@
// - NYASH_JOINIR_HEADER_EXP=1 を併用すると Header φ bypass が有効化される
// - bypass 時は MIR に Header φ が生成されないが、このテストでは JoinIR のみ検証するため問題なし
// - 将来的に JoinIR runner 実行を追加する際は、bypass モードでも正しく動作することを確認する
//
// Phase 27.5 対応:
// - このテストは Header φ だけでなく、Exit φi の合流)も JoinIR で k_exit(i) として表現できていることを検証
// - skip_ws は2箇所の break パスがあり、どちらも i を返す → LoopExitShape::exit_args = [i]
use crate::ast::ASTNode;
use crate::mir::join_ir::*;