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