feat(phase-91): Step 2-A完了 - AST recognizer & re-export chain

## Step 2-A: AST Recognizer (detect_escape_skip_pattern)
- 追加ファイル: src/mir/builder/control_flow/joinir/patterns/ast_feature_extractor.rs
  - EscapeSkipPatternInfo 構造体定義
  - detect_escape_skip_pattern() メイン関数 (MVP実装)
  - Helper関数: find_break_in_if, find_escape_in_if, find_normal_increment等

## Step 2-B: Re-export Chain (SSOT準備)
- 5ファイルで re-export を追加:
  1. src/mir/builder/control_flow/joinir/patterns/mod.rs
  2. src/mir/builder/control_flow/joinir/mod.rs
  3. src/mir/builder/control_flow/mod.rs
  4. src/mir/builder.rs
  5. src/mir/mod.rs
  6. src/mir/loop_canonicalizer/pattern_recognizer.rs

## Pattern Recognizer Wrapper
- try_extract_escape_skip_pattern() を pattern_recognizer.rs に追加
- 既存パターン(skip_whitespace等)に倣う設計

## Phase 91 MVP Design
- Quote/escape char は期待値("と\)にハードコード(Phase 91 MVP)
- Normal delta は常に1を期待
- Escape delta は AST から抽出

## Test Results
 cargo build --release: 成功
 cargo test --release --lib: 1061/1061 PASS
- 退行なし

## 次: Step 2-B本体 (Canonicalizer統合)
- canonicalizer.rs に detect_escape_skip_pattern() 統合
- LoopSkeleton & RoutingDecision を構築
- Pattern2Break に寄せる

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-16 14:36:32 +09:00
parent 42f8f4d088
commit 7db554a763
7 changed files with 271 additions and 0 deletions

View File

@ -8,6 +8,7 @@ use crate::mir::detect_continue_pattern;
use crate::mir::detect_parse_number_pattern as ast_detect_parse_number;
use crate::mir::detect_parse_string_pattern as ast_detect_parse_string;
use crate::mir::detect_skip_whitespace_pattern as ast_detect;
use crate::mir::detect_escape_skip_pattern as ast_detect_escape;
// ============================================================================
// Skip Whitespace Pattern (Phase 140-P4-B SSOT Wrapper)
@ -289,3 +290,44 @@ mod tests {
assert!(result.is_none());
}
}
// ============================================================================
// Escape Skip Pattern (Phase 91 P5b)
// ============================================================================
/// Try to extract escape skip pattern from loop
///
/// Phase 91 P5b: Pattern for string parsers with escape sequence support
///
/// Pattern structure:
/// ```
/// loop(i < n) {
/// // ... optional body statements
/// if ch == "\"" { break }
/// if ch == "\\" { i = i + escape_delta; ... }
/// out = out + ch
/// i = i + 1
/// }
/// ```
///
/// Returns (counter_name, normal_delta, escape_delta, quote_char, escape_char, body_stmts)
/// if pattern matches.
///
/// # Phase 91 P5b: Escape Sequence Pattern Detection
///
/// This function delegates to `ast_feature_extractor::detect_escape_skip_pattern`
/// for SSOT implementation.
pub fn try_extract_escape_skip_pattern(
body: &[ASTNode],
) -> Option<(String, i64, i64, char, char, Vec<ASTNode>)> {
ast_detect_escape(body).map(|info| {
(
info.counter_name,
info.normal_delta,
info.escape_delta,
info.quote_char,
info.escape_char,
info.body_stmts,
)
})
}