## 概要
Pattern8 (BoolPredicateScan) を Plan line で完走させる。
stub normalizer を完全実装に置き換え、legacy fallback を禁止。
## Step 0: Fixture 簡約
- `?:` ternary → `if/else` に変更(PoC 安定化)
## Step 1: Router Fail-Fast 化
- 文字列判定 `e.contains("[normalizer/pattern8]")` を削除
- extract が Some → normalize/lower 失敗は即 Err(fallback 禁止)
- extract が None → 次の extractor へ(legacy 含む)
## Step 2: Pattern8 normalizer 実装
- CFG: preheader → header(PHI) → body → found/step → after
- found: return false(早期脱出)
- after: return true(ループ完走)
- compose::cleanup() で 2 つの Return exit をマージ
## 検証結果
- Integration: exit 7 ✅
- Plan 完走: route=plan strategy=extract pattern=Pattern8 MATCHED
- Regression: quick 154 PASS, 0 FAILED
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
42 lines
856 B
Plaintext
42 lines
856 B
Plaintext
box StringUtils {
|
|
is_digit(ch) {
|
|
return ch == "0" or ch == "1" or ch == "2" or ch == "3" or ch == "4"
|
|
or ch == "5" or ch == "6" or ch == "7" or ch == "8" or ch == "9"
|
|
}
|
|
|
|
is_integer(s) {
|
|
if s.length() == 0 {
|
|
return false
|
|
}
|
|
|
|
local start = 0
|
|
if s.substring(0, 1) == "-" {
|
|
if s.length() == 1 {
|
|
return false
|
|
}
|
|
start = 1
|
|
}
|
|
|
|
local i = start
|
|
loop(i < s.length()) {
|
|
if not me.is_digit(s.substring(i, i + 1)) {
|
|
return false
|
|
}
|
|
i = i + 1
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
static box Main {
|
|
main() {
|
|
local u
|
|
u = new StringUtils()
|
|
if u.is_integer("123") {
|
|
return 7
|
|
} else {
|
|
return 1
|
|
}
|
|
}
|
|
}
|