ebmgen / ebmcodegen

このドキュメントは AI (Claude) によって生成されたものです。内容に誤りがある場合は [GitHub Issue](https://github.com/on-keyday/brgen/issues) で報告してください。

ebmgen / ebmcodegen #

ebmgen #

tool/ebmgen は brgen AST (JSON) または .bgn ファイルを EBM バイナリに変換するツールです。

基本的な変換 #

# JSON AST → EBM
./tool/ebmgen -i input.json -o output.ebm

# .bgn ファイルを直接変換 (libs2j が必要)
./tool/ebmgen -i input.bgn -o output.ebm

# EBM をデバッグテキストに出力
./tool/ebmgen -i input.ebm -d debug.txt

# EBM を JSON 形式でデバッグ出力
./tool/ebmgen -i input.ebm -d debug.json --debug-format json

コマンドラインオプション #

フラグ短縮説明
--input-i(必須) 入力ファイルを指定
--output-o出力 EBM バイナリファイル。- で標準出力
--debug-print-dデバッグ出力先ファイル。- で標準出力
--input-format入力フォーマットを明示指定: bgn, json-ast, ebm (デフォルト: 拡張子で自動判定)
--debug-formatデバッグ出力フォーマット: text (デフォルト), json
--interactive-Iインタラクティブデバッガーを起動
--query-qコマンドラインからクエリを実行
--query-formatクエリ出力フォーマット: id (デフォルト), text, json
--cfg-output-c制御フローグラフ (CFG) を指定ファイルに出力
--libs2j-path.bgn ファイル変換用 libs2j 動的ライブラリのパス
--debug-gデバッグモード (未使用アイテムを削除しない等)
--verbose-v詳細ログを有効化
--timing各ステップの処理時間を出力
--base64Web Playground 互換の base64 エンコードで出力
--show-flagsコマンドラインフラグの説明を JSON 形式で出力

インタラクティブクエリエンジン #

EBM の内部構造をクエリで検査できます。

# インタラクティブモード
./tool/ebmgen -i input.ebm --interactive

# コマンドラインからクエリ実行
./tool/ebmgen -i input.ebm -q "Statement { body.kind == \"IF_STATEMENT\" }"

クエリ構文: <ObjectType> { <conditions> }

  • オブジェクト型: Identifier, String, Type, Statement, Expression, Any
  • 条件演算子: ==, !=, >, >=, <, <=, and, or, not, contains
  • フィールドアクセス: . でメンバーアクセス、-> で Ref 型を逆参照、[] でインデックスアクセス

詳細は EBM API Reference を参照。


ebmcodegen #

tool/ebmcodegen は言語ジェネレーターのスケルトンを生成するメタジェネレーターです。通常は script/ebmcodegen.py 経由で呼び出します。

新しい言語ジェネレーターの追加 #

# 1. スケルトン生成 (src/ebmcg/ebm2<lang>/ を作成)
python script/ebmcodegen.py <lang_name>

# 2. ビルド
python script/build.py

# 3. テスト実行 (未実装フックを確認)
python script/unictest.py --target-runner ebm2<lang_name>

主なモード (--mode) #

モード説明
codegen(デフォルト) コードジェネレータースケルトンを生成
interpretインタープリタースケルトンを生成
hooklist利用可能なフック一覧を表示
hookkindフックの種別情報を表示
template単一フックのテンプレートを出力
subsetbody_subset.cpp を生成
dslDSL ファイルを C++ フックに変換
spec-jsonEBM スキーマを JSON 形式で出力
json-conv-headerjson_conv.hpp (JSON デシリアライズヘッダー) を生成
json-conv-sourcejson_conv.cpp (JSON デシリアライズ実装) を生成
accessorMagic Access Path 用の constexpr フィールドアクセス基盤を生成 (generate_constexpr_access)
ebmgen-visitorebmgen 自身のビジターコードを生成 (言語ジェネレーター用ではなく、ebmgen 内部用。エントリーポイントを生成しない)
codegen-class-header言語コードジェネレーター用の codegen.hpp ヘッダーを生成
codegen-class-source言語コードジェネレーター用のソース (.cpp) を生成
interpret-class-headerインタープリター用の codegen.hpp ヘッダーを生成
interpret-class-sourceインタープリター用のソース (.cpp) を生成
cmakeCMakeLists.txt を生成 (スケルトン作成時の内部利用)

EBM 構造の更新 #

extended_binary_module.bgn を変更した場合:

python script/update_ebm.py

このスクリプトは以下を順番に実行します:

  1. src/ebm/ebm.pyextended_binary_module.hpp/cpp を再生成
  2. script/build.py でビルド
  3. ebmcodegen --mode subsetbody_subset.cpp を生成
  4. ebmcodegen --mode json-conv-headerjson_conv.hpp を生成、--mode json-conv-sourcejson_conv.cpp を生成
  5. 変更があった場合は再ビルド
  6. extended_binary_module.bgn を hex テストデータに変換

注意: ebmcodegen 自体が更新対象のファイルに依存しているため、EBM 構造の変更が ebmcodegen をビルド不能にした場合は次を実行してください:

export CODEGEN_ONLY=1
python script/build.py      # ebmcodegen のみビルド
export CODEGEN_ONLY=0
python script/update_ebm.py  # 通常の更新フロー