feat(mir): Phase 25.1f完了 - Conservative PHI + ControlForm観測レイヤー

🎉 Conservative PHI Box理論による完全SSA構築

**Phase 7-B: Conservative PHI実装**
- 片方branchのみ定義変数に対応(emit_void使用)
- 全変数にPHI生成(Conservative Box理論)
- Stage-1 resolver全テスト緑化(3/3 PASS)

**Phase 25.1f: ControlForm観測レイヤー**
- LoopShape/IfShape/ControlForm構造定義
- Loop/If統一インターフェース実装
- debug_dump/debug_validate機能追加
- NYASH_CONTROL_FORM_TRACE環境変数対応

**主な変更**:
- src/mir/builder/phi.rs: Conservative PHI実装
- src/mir/control_form.rs: ControlForm構造(NEW)
- src/mir/loop_builder.rs: LoopForm v2デフォルト化

**テスト結果**:
 mir_stage1_using_resolver_min_fragment_verifies
 mir_stage1_using_resolver_full_collect_entries_verifies
 mir_parserbox_parse_program2_harness_parses_minimal_source

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: ChatGPT <chatgpt@openai.com>
This commit is contained in:
nyash-codex
2025-11-18 18:56:35 +09:00
parent 8b37e9711d
commit d3cbc71c9b
81 changed files with 907 additions and 147 deletions

View File

@ -23,16 +23,19 @@ use std::collections::HashMap;
pub struct BoxCompilationContext {
/// 変数名 → ValueId マッピング
/// 例: "args" → ValueId(0), "result" → ValueId(42)
#[allow(dead_code)]
pub variable_map: HashMap<String, ValueId>,
/// ValueId → 起源Box名 マッピング
/// NewBox命令で生成されたValueIdがどのBox型から来たかを追跡
/// 例: ValueId(10) → "ParserBox"
#[allow(dead_code)]
pub value_origin_newbox: HashMap<ValueId, String>,
/// ValueId → MIR型 マッピング
/// 各ValueIdの型情報を保持
/// 例: ValueId(5) → MirType::Integer
#[allow(dead_code)]
pub value_types: HashMap<ValueId, MirType>,
}
@ -43,6 +46,7 @@ impl BoxCompilationContext {
}
/// コンテキストが空(未使用)かどうかを判定
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.variable_map.is_empty()
&& self.value_origin_newbox.is_empty()
@ -50,6 +54,7 @@ impl BoxCompilationContext {
}
/// デバッグ用:コンテキストのサイズ情報を取得
#[allow(dead_code)]
pub fn size_info(&self) -> (usize, usize, usize) {
(
self.variable_map.len(),