[design] 現状の設計 #8

Description

@opaopa6969

親issue: opaopa6969/issue-hub#49

現状の設計(深度調査結果)

コアパイプライン

Source(式文字列)
→ FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
→ CalculatorCreatorRegistry.forBackend(backend)
→ Calculator(backend 実装)
→ calculator.apply(CalculationContext)
→ Object(評価結果)

AST 設計

  • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
    • トークン列から直接 Java コードを生成し javac でコンパイル・実行
  • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
    • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
    • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
    • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
  • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

Parser 設計

  • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
    • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
    • unlaxer-common の combinator 基盤上に構築
    • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
    • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
  • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

Evaluator の分離

Evaluator場所役割
JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

主要 API

  • CalculationContext(変数・オブジェクト・concurrent context)
  • PreConstructedCalculator / JavaCodeCalculatorV3
  • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
  • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
  • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
  • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

Backend 解決順序

  1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
  2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
  3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

型システム

  • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
  • numberfloat の別名(Float.class にマッピング)
  • 算術演算の型昇格: double > float > long > int
  • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
  • Tag ベースで型情報が parser からパーサー間で伝搬

拡張ポイント

  1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
  2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
  3. 外部関数追加: import Class#method returning TYPE as alias; 構文
  4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
  5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

FormulaInfo 記法(実装確認済み)

calculatorName: myFormula
dependsOn: otherFormula
resultType: float
numberType: float
executionBackend: p4-ast
tags: FA
formula:
var $amount as number set if not exists 100 description='amount';
call compute($amount)
float compute($x as number){
$x * 1.1
}
---END_OF_PART---
  • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

  • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
  • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
  • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
  • SPI ServiceLoader で backend を動的登録(循環依存排除)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      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;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } 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

      [design] 現状の設計 #8

      Description

      @opaopa6969

      親issue: opaopa6969/issue-hub#49

      現状の設計(深度調査結果)

      コアパイプライン

      Source(式文字列)
      → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
      → CalculatorCreatorRegistry.forBackend(backend)
      → Calculator(backend 実装)
      → calculator.apply(CalculationContext)
      → Object(評価結果)
      

      AST 設計

      • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
        • トークン列から直接 Java コードを生成し javac でコンパイル・実行
      • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
        • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
        • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
        • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
      • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

      Parser 設計

      • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
        • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
        • unlaxer-common の combinator 基盤上に構築
        • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
        • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
      • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

      Evaluator の分離

      Evaluator場所役割
      JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
      LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
      AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
      DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
      P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
      P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
      P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

      主要 API

      • CalculationContext(変数・オブジェクト・concurrent context)
      • PreConstructedCalculator / JavaCodeCalculatorV3
      • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
      • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
      • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
      • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

      Backend 解決順序

      1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
      2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
      3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

      型システム

      • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
      • numberfloat の別名(Float.class にマッピング)
      • 算術演算の型昇格: double > float > long > int
      • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
      • Tag ベースで型情報が parser からパーサー間で伝搬

      拡張ポイント

      1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
      2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
      3. 外部関数追加: import Class#method returning TYPE as alias; 構文
      4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
      5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

      FormulaInfo 記法(実装確認済み)

      calculatorName: myFormula
      dependsOn: otherFormula
      resultType: float
      numberType: float
      executionBackend: p4-ast
      tags: FA
      formula:
      var $amount as number set if not exists 100 description='amount';
      call compute($amount)
      float compute($x as number){
      $x * 1.1
      }
      ---END_OF_PART---
      
      • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

      3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

      • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
      • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
      • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
      • SPI ServiceLoader で backend を動的登録(循環依存排除)

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

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

          [design] 現状の設計 #8

          Description

          @opaopa6969

          親issue: opaopa6969/issue-hub#49

          現状の設計(深度調査結果)

          コアパイプライン

          Source(式文字列)
          → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
          → CalculatorCreatorRegistry.forBackend(backend)
          → Calculator(backend 実装)
          → calculator.apply(CalculationContext)
          → Object(評価結果)
          

          AST 設計

          • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
            • トークン列から直接 Java コードを生成し javac でコンパイル・実行
          • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
            • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
            • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
            • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
          • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

          Parser 設計

          • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
            • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
            • unlaxer-common の combinator 基盤上に構築
            • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
            • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
          • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

          Evaluator の分離

          Evaluator場所役割
          JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
          LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
          AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
          DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
          P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
          P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
          P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

          主要 API

          • CalculationContext(変数・オブジェクト・concurrent context)
          • PreConstructedCalculator / JavaCodeCalculatorV3
          • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
          • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
          • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
          • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

          Backend 解決順序

          1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
          2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
          3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

          型システム

          • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
          • numberfloat の別名(Float.class にマッピング)
          • 算術演算の型昇格: double > float > long > int
          • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
          • Tag ベースで型情報が parser からパーサー間で伝搬

          拡張ポイント

          1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
          2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
          3. 外部関数追加: import Class#method returning TYPE as alias; 構文
          4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
          5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

          FormulaInfo 記法(実装確認済み)

          calculatorName: myFormula
          dependsOn: otherFormula
          resultType: float
          numberType: float
          executionBackend: p4-ast
          tags: FA
          formula:
          var $amount as number set if not exists 100 description='amount';
          call compute($amount)
          float compute($x as number){
          $x * 1.1
          }
          ---END_OF_PART---
          
          • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

          3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

          • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
          • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
          • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
          • SPI ServiceLoader で backend を動的登録(循環依存排除)

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

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

              [design] 現状の設計 #8

              Description

              @opaopa6969

              親issue: opaopa6969/issue-hub#49

              現状の設計(深度調査結果)

              コアパイプライン

              Source(式文字列)
              → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
              → CalculatorCreatorRegistry.forBackend(backend)
              → Calculator(backend 実装)
              → calculator.apply(CalculationContext)
              → Object(評価結果)
              

              AST 設計

              • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
                • トークン列から直接 Java コードを生成し javac でコンパイル・実行
              • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
                • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
                • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
                • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
              • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

              Parser 設計

              • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
                • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
                • unlaxer-common の combinator 基盤上に構築
                • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
                • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
              • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

              Evaluator の分離

              Evaluator場所役割
              JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
              LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
              AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
              DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
              P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
              P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
              P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

              主要 API

              • CalculationContext(変数・オブジェクト・concurrent context)
              • PreConstructedCalculator / JavaCodeCalculatorV3
              • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
              • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
              • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
              • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

              Backend 解決順序

              1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
              2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
              3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

              型システム

              • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
              • numberfloat の別名(Float.class にマッピング)
              • 算術演算の型昇格: double > float > long > int
              • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
              • Tag ベースで型情報が parser からパーサー間で伝搬

              拡張ポイント

              1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
              2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
              3. 外部関数追加: import Class#method returning TYPE as alias; 構文
              4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
              5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

              FormulaInfo 記法(実装確認済み)

              calculatorName: myFormula
              dependsOn: otherFormula
              resultType: float
              numberType: float
              executionBackend: p4-ast
              tags: FA
              formula:
              var $amount as number set if not exists 100 description='amount';
              call compute($amount)
              float compute($x as number){
              $x * 1.1
              }
              ---END_OF_PART---
              
              • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

              3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

              • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
              • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
              • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
              • SPI ServiceLoader で backend を動的登録(循環依存排除)

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

                  [design] 現状の設計 #8

                  Description

                  @opaopa6969

                  親issue: opaopa6969/issue-hub#49

                  現状の設計(深度調査結果)

                  コアパイプライン

                  Source(式文字列)
                  → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
                  → CalculatorCreatorRegistry.forBackend(backend)
                  → Calculator(backend 実装)
                  → calculator.apply(CalculationContext)
                  → Object(評価結果)
                  

                  AST 設計

                  • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
                    • トークン列から直接 Java コードを生成し javac でコンパイル・実行
                  • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
                    • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
                    • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
                    • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
                  • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

                  Parser 設計

                  • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
                    • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
                    • unlaxer-common の combinator 基盤上に構築
                    • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
                    • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
                  • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

                  Evaluator の分離

                  Evaluator場所役割
                  JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
                  LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
                  AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
                  DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
                  P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
                  P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
                  P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

                  主要 API

                  • CalculationContext(変数・オブジェクト・concurrent context)
                  • PreConstructedCalculator / JavaCodeCalculatorV3
                  • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
                  • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
                  • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
                  • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

                  Backend 解決順序

                  1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
                  2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
                  3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

                  型システム

                  • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
                  • numberfloat の別名(Float.class にマッピング)
                  • 算術演算の型昇格: double > float > long > int
                  • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
                  • Tag ベースで型情報が parser からパーサー間で伝搬

                  拡張ポイント

                  1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
                  2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
                  3. 外部関数追加: import Class#method returning TYPE as alias; 構文
                  4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
                  5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

                  FormulaInfo 記法(実装確認済み)

                  calculatorName: myFormula
                  dependsOn: otherFormula
                  resultType: float
                  numberType: float
                  executionBackend: p4-ast
                  tags: FA
                  formula:
                  var $amount as number set if not exists 100 description='amount';
                  call compute($amount)
                  float compute($x as number){
                  $x * 1.1
                  }
                  ---END_OF_PART---
                  
                  • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

                  3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

                  • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
                  • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
                  • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
                  • SPI ServiceLoader で backend を動的登録(循環依存排除)

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

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

                      [design] 現状の設計 #8

                      Description

                      @opaopa6969

                      親issue: opaopa6969/issue-hub#49

                      現状の設計(深度調査結果)

                      コアパイプライン

                      Source(式文字列)
                      → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
                      → CalculatorCreatorRegistry.forBackend(backend)
                      → Calculator(backend 実装)
                      → calculator.apply(CalculationContext)
                      → Object(評価結果)
                      

                      AST 設計

                      • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
                        • トークン列から直接 Java コードを生成し javac でコンパイル・実行
                      • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
                        • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
                        • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
                        • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
                      • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

                      Parser 設計

                      • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
                        • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
                        • unlaxer-common の combinator 基盤上に構築
                        • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
                        • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
                      • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

                      Evaluator の分離

                      Evaluator場所役割
                      JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
                      LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
                      AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
                      DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
                      P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
                      P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
                      P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

                      主要 API

                      • CalculationContext(変数・オブジェクト・concurrent context)
                      • PreConstructedCalculator / JavaCodeCalculatorV3
                      • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
                      • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
                      • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
                      • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

                      Backend 解決順序

                      1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
                      2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
                      3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

                      型システム

                      • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
                      • numberfloat の別名(Float.class にマッピング)
                      • 算術演算の型昇格: double > float > long > int
                      • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
                      • Tag ベースで型情報が parser からパーサー間で伝搬

                      拡張ポイント

                      1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
                      2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
                      3. 外部関数追加: import Class#method returning TYPE as alias; 構文
                      4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
                      5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

                      FormulaInfo 記法(実装確認済み)

                      calculatorName: myFormula
                      dependsOn: otherFormula
                      resultType: float
                      numberType: float
                      executionBackend: p4-ast
                      tags: FA
                      formula:
                      var $amount as number set if not exists 100 description='amount';
                      call compute($amount)
                      float compute($x as number){
                      $x * 1.1
                      }
                      ---END_OF_PART---
                      
                      • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

                      3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

                      • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
                      • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
                      • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
                      • SPI ServiceLoader で backend を動的登録(循環依存排除)

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

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

                          [design] 現状の設計 #8

                          Description

                          @opaopa6969

                          親issue: opaopa6969/issue-hub#49

                          現状の設計(深度調査結果)

                          コアパイプライン

                          Source(式文字列)
                          → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
                          → CalculatorCreatorRegistry.forBackend(backend)
                          → Calculator(backend 実装)
                          → calculator.apply(CalculationContext)
                          → Object(評価結果)
                          

                          AST 設計

                          • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
                            • トークン列から直接 Java コードを生成し javac でコンパイル・実行
                          • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
                            • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
                            • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
                            • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
                          • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

                          Parser 設計

                          • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
                            • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
                            • unlaxer-common の combinator 基盤上に構築
                            • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
                            • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
                          • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

                          Evaluator の分離

                          Evaluator場所役割
                          JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
                          LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
                          AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
                          DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
                          P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
                          P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
                          P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

                          主要 API

                          • CalculationContext(変数・オブジェクト・concurrent context)
                          • PreConstructedCalculator / JavaCodeCalculatorV3
                          • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
                          • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
                          • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
                          • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

                          Backend 解決順序

                          1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
                          2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
                          3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

                          型システム

                          • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
                          • numberfloat の別名(Float.class にマッピング)
                          • 算術演算の型昇格: double > float > long > int
                          • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
                          • Tag ベースで型情報が parser からパーサー間で伝搬

                          拡張ポイント

                          1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
                          2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
                          3. 外部関数追加: import Class#method returning TYPE as alias; 構文
                          4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
                          5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

                          FormulaInfo 記法(実装確認済み)

                          calculatorName: myFormula
                          dependsOn: otherFormula
                          resultType: float
                          numberType: float
                          executionBackend: p4-ast
                          tags: FA
                          formula:
                          var $amount as number set if not exists 100 description='amount';
                          call compute($amount)
                          float compute($x as number){
                          $x * 1.1
                          }
                          ---END_OF_PART---
                          
                          • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

                          3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

                          • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
                          • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
                          • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
                          • SPI ServiceLoader で backend を動的登録(循環依存排除)

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

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

                              [design] 現状の設計 #8

                              Description

                              @opaopa6969

                              親issue: opaopa6969/issue-hub#49

                              現状の設計(深度調査結果)

                              コアパイプライン

                              Source(式文字列)
                              → FormulaInfoParser(メタデータ解析 + ExecutionBackend 選択)
                              → CalculatorCreatorRegistry.forBackend(backend)
                              → Calculator(backend 実装)
                              → calculator.apply(CalculationContext)
                              → Object(評価結果)
                              

                              AST 設計

                              • 手書き AST(レガシー経路): OperatorOperandTreeCreatorJavaCodeCalculatorV3
                                • トークン列から直接 Java コードを生成し javac でコンパイル・実行
                              • 生成 AST(P4/DSL 経路): UBNF → unlaxer-dsl codegen → Parser + Mapper + Evaluator
                                • 生成物は target/generated-sources/tinyexpression-p4/runtime/ 以下
                                • pom.xmlexec-maven-plugingenerate-sources フェーズに自動実行
                                • 生成クラス例: BinaryExprIfExprMatchExprMethodInvocationExprExternalXxxInvocationExprStringConcatExprInTimeRangeExpr
                              • 型付き AST(P4 経路): P4TypedAstEvaluator — sealed switch による型安全な AST 走査(PRIMARY)

                              Parser 設計

                              • 手書き Combinator パーサー (src/main/java/org/unlaxer/tinyexpression/parser/):
                                • 各演算子・構文要素ごとに独立した Parser クラス(例: BooleanAndExpressionParserTernaryOperatorParser 等)
                                • unlaxer-common の combinator 基盤上に構築
                                • TinyExpressionParserCapabilities:delimiter/head 判定を parser 所有に集約(evaluator 側の drift 防止)
                                • TinyExpressionKeywordsif/match/call/external/var/variable キーワードを共有定数化
                              • 生成パーサー (target/generated-sources/.../runtime/): UBNF から自動生成

                              Evaluator の分離

                              Evaluator場所役割
                              JavaCodeCalculatorV3evaluator/javacode/本番 JavaCode 生成・実行
                              LegacyAstCreatorJavaCodeCalculatorevaluator/javacode/legacy/旧 OOTC 経路(凍結)
                              AstEvaluatorCalculatorevaluator/ast/AST 走査実行(generated→token→javacode fallback chain)
                              DslJavaCodeCalculatorevaluator/javacode/DSL JavaCode シーム(native + legacy bridge)
                              P4AstEvaluatorCalculatorevaluator/p4/P4 生成パーサー + AST 評価
                              P4DslJavaCodeCalculatorevaluator/p4/P4 生成パーサー + DSL Java 生成
                              P4TypedAstEvaluatorevaluator/p4/PRIMARY sealed switch 型安全評価

                              主要 API

                              • CalculationContext(変数・オブジェクト・concurrent context)
                              • PreConstructedCalculator / JavaCodeCalculatorV3
                              • TinyExpressionsExecutor:複数式を依存関係付きでまとめて実行
                              • FileBaseTinyExpressionInstancesCache:テナントごとに formulaInfo.txt を読込・キャッシュ
                              • FormulaInfoAdditionalFields:グローバル既定 backend を外出し
                              • ResultConsumer:結果を context 書き戻し / ドメイン反映へ委譲

                              Backend 解決順序

                              1. FormulaInfoAdditionalFields.executionBackend(グローバル既定値、初期値 JAVA_CODE
                              2. 式ごとの executionBackend / backend キー(FormulaInfo メタデータ)
                              3. CalculatorCreatorRegistry.forBackend(...) でディスパッチ

                              型システム

                              • ExpressionTypes enum: _byte/_short/_int/_float/_double/_long/bigDecimal/bigInteger/number/string/_boolean/object/timestamp/_void
                              • numberfloat の別名(Float.class にマッピング)
                              • 算術演算の型昇格: double > float > long > int
                              • SpecifiedExpressionTypes:式の評価型と結果型を明示的に指定
                              • Tag ベースで型情報が parser からパーサー間で伝搬

                              拡張ポイント

                              1. 新 backend 追加: ExecutionBackend enum + CalculatorCreatorRegistry に登録(将来的には SPI ServiceLoader 化を計画 — TINYEXPRESSION-MULTIPROJECT-PLAN.md
                              2. 文法拡張: tools/tinyexpression-p4-lsp-vscode/grammar/tinyexpression-p4.ubnf を編集 → mvn compile で再生成
                              3. 外部関数追加: import Class#method returning TYPE as alias; 構文
                              4. カタログ拡張: CatalogProvider 実装(FileBase / InMemory / Composite)
                              5. LSP/DAP 拡張: unlaxer-dsl@catalog / @declares / @quickFix / @quickFixHook アノテーション(設計中)

                              FormulaInfo 記法(実装確認済み)

                              calculatorName: myFormula
                              dependsOn: otherFormula
                              resultType: float
                              numberType: float
                              executionBackend: p4-ast
                              tags: FA
                              formula:
                              var $amount as number set if not exists 100 description='amount';
                              call compute($amount)
                              float compute($x as number){
                              $x * 1.1
                              }
                              ---END_OF_PART---
                              
                              • 主要キー: calculatorName / dependsOn / resultType / numberType / formula / executionBackend(backend) / tags / description / var / field / checkKind

                              3層アーキテクチャ計画(TINYEXPRESSION-MULTIPROJECT-PLAN.md

                              • Layer 1tinyexpression-api: CalculatorExecutionBackendFormulaInfoSource(pure API)
                              • Layer 2tinyexpression-evaluators-*: JAVA_CODE / AST_EVALUATOR / DSL_JAVA_CODE
                              • Layer 3tinyexpression-p4 + tinyexpression-tooling: UBNF 生成バックエンド + LSP/DAP/CLI
                              • SPI ServiceLoader で backend を動的登録(循環依存排除)

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions