fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43) - #34

Merged
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic
Jun 25, 2026
Merged

fix(p4): math関数算術 & variadic min/max を正答化 (closes #21; refs #22,#43)#34
opaopa6969 merged 4 commits into
masterfrom
fix/issue-43-21-math-arithmetic

Conversation

@opaopa6969

Copy link
Copy Markdown
Owner

概要

P4_AST_EVALUATOR で abs(-3)+pow(2,3)StackOverflow→誤値min(3,5,1)/max(3,5,1,9) が cross-check により 誤legacy値(3/5)で上書き されていた問題を修正。

根因は unlaxer-dsl の生成マッパーが算術コンテキストの関数項を脱落させていたこと(unlaxer-parser #43 / PR #44 で根治)。本PRは unlaxer-dsl 3.0.5 を採用し、widメンされた BinaryExpr オペランド型に評価器を追従させ、cross-check を是正する。

変更

  • P4TypedAstEvaluator: evalBinaryAsNumber がオペランドを evalOperandAsNumber でディスパッチ(BinaryExprはスパイン継続、AbsExpr/PowExpr/IfExpr等は eval)。source-snippet経路は ExpressionExpr を unwrap してから BinaryExpr ガードに入れ、abs(-3)+pow(2,3) の無限再帰(StackOverflow)を解消。
  • P4DefaultJavaCodeEmitter/P4TypedJavaCodeEmitter: renderOperand で同様にディスパッチ。
  • AstDeclarationRuntime: 宣言式の主式を source-aware な P4TypedAstEvaluator で評価($price+2 がreflection経路に落ちて setter値を返していた回帰を修正)。
  • AstEvaluatorCalculator: 数値 cross-check が正しいP4結果を壊れたlegacy(variadic min/max・boolean優先順位)で上書きしないよう、P4を信頼し差分は観測markerのみ記録 (cross-check が正しいP4結果を壊れたlegacyで上書きする (variadic min/max・boolean優先順位・関数項脱落) #21)。

検証

abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, 宣言式 $price+2=5 — 全て p4-typed で正答。パリティ/コーパス各スイート緑、回帰ゼロ。

⚠️ マージ前提

unlaxer-dsl 3.0.5 の公開が必要(依存)。unlaxer-parser PR #44 をマージ& Maven Central へ 3.0.5 をデプロイ後でないと、本PRのCIは依存解決に失敗します。

未対応(#22 残)

.in() 意味バグ(常時true)、ダブルクォート+ドットメソッド parse、メソッド引数スコープ。#43 case3(variadic mapper rest-capture, 無害) も将来。

🤖 Generated with Claude Code

opaopa6969and others added 2 commits June 25, 2026 21:32
…#21; refs #22, #43)
Adopts unlaxer-dsl 3.0.5, whose generated mapper now maps a function/conditional
factor operand to its real AST node instead of dropping it. Adapts the P4 evaluators
to the widened BinaryExpr operand type (base AST interface) and fixes the cross-check:
- P4TypedAstEvaluator: evalBinaryAsNumber dispatches each operand via evalOperandAsNumber
(BinaryExpr stays on the spine; AbsExpr/PowExpr/IfExpr/… go through eval), and the
source-snippet path unwraps ExpressionExpr before its BinaryExpr guard to stop the
infinite recursion that StackOverflowed on "abs(-3)+pow(2,3)".
- P4DefaultJavaCodeEmitter / P4TypedJavaCodeEmitter: renderOperand dispatches operands
to the same effect for the Java-code backends.
- AstDeclarationRuntime: evaluate a declaration's main expression with the source-aware
P4TypedAstEvaluator so "$price+2" stays on the typed path (was falling to the
reflection evaluator and returning the setter value).
- AstEvaluatorCalculator: the numeric cross-check no longer discards a correct P4-typed
result for the buggy legacy token-AST (variadic min/max, boolean precedence). Now that
P4-typed math is correct it keeps the P4 result and only records the divergence (#21).
Verified: abs(-3)+pow(2,3)=11, min(3,5,1)=1, max(3,5,1,9)=9, sqrt(4)*5=10, declaration
"$price+2"=5 — all P4-typed; parity/corpus suites green, no regressions.
Resolves the #22 javacode-math gap; the remaining #22 items (.in semantics,
double-quote dot methods, method-arg scope) are not addressed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e-text splitter
Now that the mapper maps StringComparisonExpr.left/right to the correct operand nodes
(unlaxer-dsl 3.0.5, findDescendants rule-level fix), evalStringComparisonExpr evaluates
node.left()/node.right() directly instead of re-splitting the source formula at the
top-level ==/!= by hand.
Removes the hand-rolled char-scanning workaround that this obsoletes:
tryExtractStringComparisonFromSourceFormula / splitTopLevelStringComparison /
matchesComparisonOperator / resolveStringComparisonSide / tryEvaluateStringSourceSnippet
and the StringComparisonSource record (~130 lines). The combinator-generated AST is the
single source of truth; consumers no longer reparse the source string.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
opaopa6969and others added 2 commits June 26, 2026 00:47
… from AST (#35)
The post-#44 mapper maps every arithmetic operand to a real AST node
(mapAssocOperandToBinaryExpr), so BinaryExpr.left()/op()/right() is now a
faithful tree. The source-text re-parse shadows that preceded the AST walk
were therefore dead compensation:
- P4TypedAstEvaluator: remove tryEvaluateStructuredBinaryNode /
tryEvaluateStructuredBinarySourceSnippet / hasStructuredNumericAlternative
- P4TypedJavaCodeEmitter / P4DefaultJavaCodeEmitter: remove
renderStructuredBinaryNode / renderStructuredBinarySourceSnippet /
hasStructuredNumericAlternative
evalBinaryExpr / evalBinaryAsNumber now go straight to the AST walk. The
slice path keeps renderNumericSourceSnippet for now (separate #35 cycle).
Verified: full suite 630 tests, baseline gate green (no new failures),
legacy-fallback observations 171->170. -120 LOC.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both AstEvaluatorCalculatorTest#testTypeInference and
P4AstEvaluatorCalculatorTest#testTypeInference pass consistently across
three full runs after the 3.0.5 mapper fix + numeric-leaf cycle. The
baseline gate flagged them as FIXED; tightening it so a future regression
in type inference fails CI again. Only the double-parens-ternary parse
case (exponential backtracking) remains known-failing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@opaopa6969
opaopa6969 merged commit d7bcb26 into masterJun 25, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@opaopa6969