## 症状 生成された P4 パーサが特定の構造で**指数的バックトラック**を起こし、パースに秒〜分かかる。 ### 実測 - `sin(( > 0 ? : 0))`(二重カッコ三項): パース ~5秒 → 最終的に `ParseException`。`TernaryExpressionTest#testTernaryInSinWithDoubleParensStillWorks` が `test-baseline.txt` の唯一の既知失敗として残存。 - if-source shadow(`tryEvaluateIfFromSource`)を無効化して AST 経路を強制すると、`P4AstEvaluatorCalculatorTest` が **約1048秒**(通常は十数秒)。条件内の文字列値サブ式が `tryEvaluateStructuredStringLeaf` でソース再パースに落ち、その再パースが重い構造でバックトラックするため。 ## 原因 - パーサコンビネータ基盤(unlaxer)にメモ化が無く、選択(`ArgumentTernary | Expression`、ネストした括弧/三項)でバックトラックが指数化。 - 根治は **unlaxer-parser #40 (packrat メモ化, opt-in)**。本 issue はその downstream 影響と再現条件を記録するもの。 ## 影響 - `#32` fallback=0: if-source shadow を外すと上記の遅延が顕在化。fallback=0 達成には本性能問題の解決も前提。 - CI: 二重カッコ三項は baseline 既知失敗として許容中。 ## 対策候補 1. unlaxer-parser #40 (packrat) を opt-in で生成パーサに適用。 2. `ArgumentExpression ::= ArgumentTernary | Expression` の選択順・曖昧性を見直し(左因子化など)。 3. ソース再パース経路の除去(#35)が進めば再パース起因の遅延は自然消滅。 関連: #32, #35, unlaxer-parser#40 🤖 Generated with [Claude Code](https://claude.com/claude-code)
症状
生成された P4 パーサが特定の構造で指数的バックトラックを起こし、パースに秒〜分かかる。
実測
sin(( > 0 ? : 0))(二重カッコ三項): パース ~5秒 → 最終的にParseException。TernaryExpressionTest#testTernaryInSinWithDoubleParensStillWorksがtest-baseline.txtの唯一の既知失敗として残存。tryEvaluateIfFromSource)を無効化して AST 経路を強制すると、P4AstEvaluatorCalculatorTestが 約1048秒(通常は十数秒)。条件内の文字列値サブ式がtryEvaluateStructuredStringLeafでソース再パースに落ち、その再パースが重い構造でバックトラックするため。原因
ArgumentTernary | Expression、ネストした括弧/三項)でバックトラックが指数化。影響
#32fallback=0: if-source shadow を外すと上記の遅延が顕在化。fallback=0 達成には本性能問題の解決も前提。対策候補
ArgumentExpression ::= ArgumentTernary | Expressionの選択順・曖昧性を見直し(左因子化など)。関連: #32, #35, unlaxer-parser#40
🤖 Generated with Claude Code