feat(mir): Loop Canonicalizer Phase 3 - skip_whitespace pattern recognition
## Summary
skip_whitespace パターンを Skeleton→Decision で認識可能に。
dev-only 観測で chosen=Pattern3IfPhi / missing_caps=[] を固定。
## Changes
- src/mir/loop_canonicalizer/mod.rs:
- try_extract_skip_whitespace_pattern() 追加
- loop(cond) { ... if check { p = p + 1 } else { break } } パターン認識
- carrier name, delta, body statements を抽出
- canonicalize_loop_expr() 拡張(skip_whitespace 対応)
- Pattern3IfPhi 成功時は RoutingDecision::success 返却
- Skeleton に HeaderCond, Body, Update ステップ追加
- CarrierSlot に Counter role 設定
- ExitContract に has_break=true 設定
- Phase 3 unit tests 追加
- test_skip_whitespace_pattern_recognition: 基本パターン
- test_skip_whitespace_with_body_statements: body 付きパターン
- test_skip_whitespace_fails_without_else: else なし失敗
- test_skip_whitespace_fails_with_wrong_delta: 減算パターン失敗
- Phase 2 obsolete tests 削除
- src/mir/builder/control_flow/joinir/routing.rs:
- Debug 出力拡張(chosen pattern 表示)
## Tests
- cargo test --release --lib loop_canonicalizer::tests: PASS(11 tests)
- cargo test --release --lib: PASS(1044 tests, 退行なし)
- HAKO_JOINIR_DEBUG=1 test_pattern3_skip_whitespace.hako:
- chosen=Pattern3IfPhi ✅
- missing_caps=[] ✅
## Validation
- ✅ dev-only 観測(HAKO_JOINIR_DEBUG=1)のときだけログ出力
- ✅ フラグ OFF 時は完全不変
- ✅ skip_whitespace パターンで SUCCESS 固定
- ✅ unit tests で全パターン固定
Phase 137-3 complete
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
# Loop Canonicalizer(設計 SSOT)
|
||||
|
||||
Status: Phase 1 done(型定義まで)
|
||||
Status: Phase 2 done(dev-only 観測まで)
|
||||
Scope: ループ形の組み合わせ爆発を抑えるための “前処理” の設計(fixture/shape guard/fail-fast と整合)
|
||||
Related:
|
||||
- SSOT (契約/不変条件): `docs/development/current/main/joinir-architecture-overview.md`
|
||||
@ -160,12 +160,12 @@ pub enum CarrierRole {
|
||||
|
||||
## 実装の入口(現状)
|
||||
|
||||
Phase 1(型定義のみ)の実装はここ:
|
||||
実装(Phase 1–2)はここ:
|
||||
- `src/mir/loop_canonicalizer/mod.rs`
|
||||
|
||||
注意:
|
||||
- ここは「型と語彙の SSOT」を置く場所で、routing/lowering にはまだ介入しない。
|
||||
- Phase 2 以降で `canonicalize(loop_ast) -> (LoopSkeleton, RoutingDecision)` を導入し、dev-only で観測から始める。
|
||||
- Phase 2 で `canonicalize_loop_expr(...) -> Result<(LoopSkeleton, RoutingDecision), String>` を導入し、JoinIR ループ入口で dev-only 観測できるようにした(既定挙動は不変)。
|
||||
- 観測ポイント(JoinIR ループ入口): `src/mir/builder/control_flow/joinir/routing.rs`(`joinir_dev_enabled()` 配下)
|
||||
|
||||
## Capability の語彙(Fail-Fast reason タグ)
|
||||
|
||||
@ -197,7 +197,7 @@ Canonicalizer の判定結果は `RoutingDecision` に集約し、以下に流
|
||||
```rust
|
||||
pub struct RoutingDecision {
|
||||
/// 選択された Pattern(None = Fail-Fast)
|
||||
pub chosen: Option<LoopPattern>,
|
||||
pub chosen: Option<LoopPatternKind>,
|
||||
|
||||
/// 不足している Capability のリスト
|
||||
pub missing_caps: Vec<&'static str>,
|
||||
@ -206,7 +206,7 @@ pub struct RoutingDecision {
|
||||
pub notes: Vec<String>,
|
||||
|
||||
/// error_tags への追記(contract_checks 用)
|
||||
pub error_tags: Vec<ErrorTag>,
|
||||
pub error_tags: Vec<String>,
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user