Skip to content

Instantly share code, notes, and snippets.

@takahashim
Last active June 15, 2025 04:01
Show Gist options
  • Save takahashim/d60dfcfd9f4f5e7902dd97d47ef0cbeb to your computer and use it in GitHub Desktop.
Save takahashim/d60dfcfd9f4f5e7902dd97d47ef0cbeb to your computer and use it in GitHub Desktop.

Re:VIEW AST導入計画

概要

Re:VIEWの内部アーキテクチャを、現在の直接Builder呼び出し方式から、共通のAST(抽象構文木)を経由する方式に段階的に変更する計画です。

現在の構造

Re:VIEW文書 → Compiler → Builder(各フォーマット) → 出力

目標構造

Re:VIEW文書 → Compiler → AST → ASTRenderer → Builder(各フォーマット) → 出力

段階的移行手順

フェーズ1: AST基盤の準備(互換性維持)

1.1 ASTノードクラスの定義

  • lib/review/ast/ ディレクトリを作成
  • 基底ノードクラス Node を定義
    • 共通属性(位置情報、子ノード管理等)
    • Visitor パターン対応
  • 主要要素のノードクラスを作成:
    • HeadlineNode - 見出し(レベル、ラベル、キャプション)
    • ParagraphNode - 段落(テキスト内容)
    • ListNode - リスト(順序付き/なし、ネスト対応)
    • TableNode - 表(ヘッダー、行、列)
    • ImageNode - 画像(ID、キャプション、メトリック)
    • CodeBlockNode - コードブロック(言語、行番号等)
    • InlineNode - インライン要素(タイプ、引数)

1.2 CompilerにAST生成オプションを追加

  • 既存の直接Builder呼び出しを維持(後方互換性)
  • 新しい ast_mode フラグで動作を切り替え
    • false(デフォルト):既存の動作
    • true:AST生成モード
  • AST生成時は中間表現を構築、通常時は既存の動作を継続

1.3 JSON出力機能の実装

  • ASTのJSON シリアライゼーション
    • 各ノードクラスに to_json メソッドを実装
    • ノードタイプ、属性、子ノードの情報を含める
    • 位置情報(ファイル名、行番号)も保持
  • JSONBuilderクラスの作成
    • AST → JSON変換専用のBuilderクラス
    • review-compile --target=json でJSON出力を可能に
  • デバッグ・解析支援
    • JSON形式での構文木可視化
    • 外部ツールでの解析が容易に
    • CI/CDでの構造検証に活用可能

フェーズ2: AST → Builder 変換レイヤーの実装

現在の状況: 基本的なASTRendererは実装済み。ハイブリッドモードの段階的移行を実装する。

2.1 ASTからBuilderへの変換器強化 ✅ (基本実装完了)

  • ASTRenderer クラス実装済み ✅
    • ASTを受け取り、既存のBuilderメソッドを呼び出す ✅
    • Visitor パターンでノードタイプごとに処理 ✅
    • 既存のBuilderクラスとの完全互換性を保持 ✅

2.2 段階的移行の仕組み実装

目標: 特定の要素のみAST経由で処理し、段階的に移行範囲を拡大

Phase 2.2.1: ハイブリッドモード基盤整備 ✅ 完了
  • タスク1: ASTCompilerでのハイブリッドモード改良 ✅

    • ast_elements配列による要素指定機能の詳細設計・実装 ✅
    • 要素タイプ(symbol)による細かい制御機能 ✅
    • デバッグ用ログ機能(どの要素がAST経由か表示) ✅
  • タスク2: 段階的移行制御システム ✅

    • 設定ファイルでの移行要素指定機能 ✅
    • 環境変数での移行段階制御 ✅
    • パフォーマンス測定用フラグ ✅
    • パフォーマンストラッキングロジックの専用クラス化 ✅
Phase 2.2.2: 段階的要素移行(優先順位順)

各段階で以下を実行:

  1. 該当要素のAST処理有効化
  2. 既存テストスイート実行(回帰テスト)
  3. 新規テストケース追加(AST経由の動作確認)
  4. パフォーマンス測定・比較
  5. 次段階への判定

移行順序:

  1. Stage 1: 見出し(headline) ✅ 完了

    • ast_elements: [:headline] での部分AST化 ✅
    • tagged section(column等)との互換性確認 ✅
  2. Stage 2: 段落(paragraph) ✅ 完了

    • インライン要素との連携確認 ✅
    • テキスト処理の互換性確認 ✅
  3. Stage 3: リスト(ulist, olist, dlist) ✅ 完了

    • 基本的なリスト処理確認 ✅
    • リスト間の切り替え処理確認 ✅
    • ネストしたリストの処理(一部改善余地あり)
  4. Stage 4: 表(table) ✅ 完了

    • ヘッダー分離処理の確認 ✅
    • TableNodeクラスの実装 ✅
    • 基本的な表レイアウトの互換性確認 ✅
  5. Stage 5: 画像(image, indepimage, numberlessimage) ✅ 完了

    • 各種画像タイプの完全対応 ✅
    • メトリック情報の正確な受け渡し確認 ✅
    • AST経由での画像処理の完全実装 ✅
  6. Stage 6: コードブロック(list, emlist, cmd, source等) ✅ 完了

    • 行番号付き/なしの両対応確認 ✅
    • 言語指定の正確な受け渡し確認 ✅
    • listnum, emlistnum対応 ✅
  7. Stage 7: インライン要素(@<b>, @<code>等) ✅ 完了

    • 既存のparagraph/list AST処理経由で自動的に対応 ✅
    • 複雑なネストしたインライン要素処理 ✅
    • 特殊なインライン要素(ruby, href等)処理 ✅
Phase 2.2.3: 検証とクリーンアップ ✅ 完了
  • タスク3: 全要素統合テスト ✅

    • 複雑な文書での全要素AST処理確認 ✅
    • AST list tests 全てpass ✅
    • 各Stage の回帰テスト実行 ✅
  • タスク4: パフォーマンス最適化 ✅

    • AST生成の安定性確認 ✅
    • JSONBuilder参照エラー修正 ✅
    • リスト処理構造の改善 ✅

2.3 テストとデバッグ強化

  • 継続タスク: 各段階での検証
    • 既存のテストスイートを各段階で実行
    • AST出力のデバッグ機能追加(JSON diff等)
    • パフォーマンス測定の自動化

2.4 フェーズ2完了条件

  • 全要素がAST経由での処理に対応
  • 既存の全テストがpassすること
  • パフォーマンス劣化が許容範囲内(±10%以内)
  • 各Builderでの出力結果が従来と同一であること

フェーズ3: 全面AST化

3.1 全要素のAST化

  • すべての構文要素をAST経由で処理
  • レガシーな直接呼び出しコードの無効化
  • 既存のテストが全て通ることを確認

3.2 最適化とクリーンアップ

  • ASTノード生成の最適化
  • メモリ使用量の最適化
  • パフォーマンス測定と改善

3.3 API安定化

  • 公開APIの確定
  • ドキュメント整備
  • 互換性ガイドの作成

フェーズ4: AST活用機能の実装

4.1 AST独自機能の追加

  • ASTの直接操作API
    • ノードの追加・削除・変更
    • 構造の検証
  • プリプロセッサ・ポストプロセッサ
    • AST変換フィルター
    • カスタム処理の挿入点

4.2 開発支援ツール

  • AST可視化ツール
  • 構文解析デバッガー
  • パフォーマンス分析ツール

4.3 拡張機能

  • プラグインシステム(AST変換ベース)
  • 静的解析機能
  • 文書構造の検証・リファクタリング

実装の詳細設計

ASTノード階層

module ReVIEW
  module AST
    class Node
      attr_accessor :location, :parent, :children
      
      def initialize(location = nil)
        @location = location
        @children = []
        @parent = nil
      end
      
      def accept(visitor)
        visitor.visit(self)
      end
      
      # JSON出力用
      def to_h
        {
          type: self.class.name.split('::').last,
          location: location_to_h,
          children: children.map(&:to_h)
        }
      end
      
      def to_json(*args)
        to_h.to_json(*args)
      end
      
      private
      
      def location_to_h
        return nil unless location
        {
          filename: location.filename,
          lineno: location.lineno
        }
      end
    end
    
    class DocumentNode < Node
      attr_accessor :title, :chapters
      
      def to_h
        super.merge(
          title: title,
          chapters: chapters&.map(&:to_h)
        )
      end
    end
    
    class HeadlineNode < Node
      attr_accessor :level, :label, :caption
      
      def to_h
        super.merge(
          level: level,
          label: label,
          caption: caption
        )
      end
    end
    
    class ParagraphNode < Node
      attr_accessor :content
      
      def to_h
        super.merge(
          content: content
        )
      end
    end
    
    class ListNode < Node
      attr_accessor :list_type, :items
      
      def to_h
        super.merge(
          list_type: list_type, # :ul, :ol, :dl
          items: items&.map(&:to_h)
        )
      end
    end
    
    class TableNode < Node
      attr_accessor :id, :caption, :headers, :rows
      
      def to_h
        super.merge(
          id: id,
          caption: caption,
          headers: headers,
          rows: rows
        )
      end
    end
    
    class ImageNode < Node
      attr_accessor :id, :caption, :metric
      
      def to_h
        super.merge(
          id: id,
          caption: caption,
          metric: metric
        )
      end
    end
    
    class CodeBlockNode < Node
      attr_accessor :lang, :id, :caption, :lines, :line_numbers
      
      def to_h
        super.merge(
          lang: lang,
          id: id,
          caption: caption,
          lines: lines,
          line_numbers: line_numbers
        )
      end
    end
    
    class InlineNode < Node
      attr_accessor :inline_type, :args
      
      def to_h
        super.merge(
          inline_type: inline_type,
          args: args
        )
      end
    end
  end
end

JSONBuilder の実装

module ReVIEW
  class JSONBuilder < Builder
    def initialize
      super
      @ast_nodes = []
    end
    
    def bind(compiler, chapter, location)
      super
      @document_node = AST::DocumentNode.new(location)
      @current_node = @document_node
    end
    
    def result
      @document_node.to_json
    end
    
    def headline(level, label, caption)
      node = AST::HeadlineNode.new(@location)
      node.level = level
      node.label = label
      node.caption = caption
      add_node(node)
    end
    
    def paragraph(lines)
      node = AST::ParagraphNode.new(@location)
      node.content = lines.join("\n")
      add_node(node)
    end
    
    # その他のメソッドも同様に実装...
    
    private
    
    def add_node(node)
      @current_node.children << node
      node.parent = @current_node
    end
  end
end

Compiler の変更

class Compiler
  def initialize(builder, ast_mode: false)
    @builder = builder
    @ast_mode = ast_mode
    @ast_root = nil if @ast_mode
  end
  
  def compile(chap)
    if @ast_mode
      @ast_root = build_ast(chap)
      renderer = ASTRenderer.new(@builder)
      renderer.render(@ast_root)
    else
      # 既存の処理
      do_compile
    end
    @builder.result
  end
end

互換性の保証

  1. API互換性:既存のBuilderクラスのAPIは変更しない
  2. 動作互換性:出力結果は既存と同一であることを保証
  3. 設定互換性:既存の設定ファイルはそのまま使用可能
  4. プラグイン互換性:既存のプラグインは動作を継続

テスト戦略

  1. 既存テストの継続実行:全フェーズで既存テストが通ることを確認
  2. AST特有のテスト追加:ノード生成、変換の正確性をテスト
  3. パフォーマンステスト:処理速度、メモリ使用量の回帰テスト
  4. 統合テスト:実際の書籍プロジェクトでの動作確認

スケジュール目安

  • フェーズ1:2-3週間(基盤実装 + JSON出力機能) ✅ 完了
  • フェーズ2:4-6週間(段階的移行)
  • フェーズ3:2-3週間(全面移行・最適化)
  • フェーズ4:継続的開発(新機能追加)

フェーズ1の詳細スケジュール ✅ 完了

  • Week 1: ASTノードクラス設計・実装 ✅
  • Week 2: Compiler のAST生成機能追加 ✅
  • Week 3: JSON出力機能(JSONBuilder)実装・テスト ✅

フェーズ2の詳細スケジュール(4-6週間)

Week 1: ハイブリッドモード基盤整備

  • Day 1-2: タスク1 - ASTCompilerのハイブリッドモード改良
    • ast_elements配列による要素指定機能の詳細設計
    • デバッグ用ログ機能の実装
    • 要素タイプによる細かい制御の実装
  • Day 3-5: タスク2 - 段階的移行制御システム
    • 設定ファイル対応の実装
    • 環境変数による制御の実装
    • パフォーマンス測定基盤の整備

Week 2-3: 段階的要素移行 (Stage 1-3) ✅ 完了

  • Week 2: ✅ 完了
    • Stage 1: 見出し(headline)のAST化 ✅
    • Stage 2: 段落(paragraph)のAST化 ✅
    • 各段階での回帰テスト実行 ✅
  • Week 3: ✅ 完了
    • Stage 3: リスト(ulist, olist, dlist)のAST化 ✅
    • インライン要素との連携テスト ✅
    • パフォーマンス測定・比較 ✅

Week 4-5: 段階的要素移行 (Stage 4-7)

  • Week 4: ✅ 完了
    • Stage 4: 表(table)のAST化 ✅
    • Stage 5: 画像(image)のAST化 ✅
    • 複雑な要素での互換性確認 ✅
  • Week 5: 🔄 進行中
    • Stage 6: コードブロック(list, emlist, cmd, source等)のAST化 🔄
    • Stage 7: インライン要素のAST化
    • 統合テストの実行

Week 6: 検証とクリーンアップ

  • Day 1-3: 全要素統合テスト
    • samples/配下での全面テスト
    • 各Builder(HTML, LaTeX, EPUB等)での互換性確認
  • Day 4-5: パフォーマンス最適化
    • ボトルネック特定・改善
    • メモリ使用量最適化
    • 最終的な回帰テスト実行

現在の進捗(Phase 2.2.2)

実装済み機能 ✅

  1. ハイブリッドモード基盤

    • ASTConfigによる段階的移行制御システム
    • YAML設定ファイルでのast.stage指定
    • 環境変数(REVIEW_AST_MODE等)での制御
    • デバッグログ機能(REVIEW_DEBUG_AST=true
    • パフォーマンス測定機能(ASTPerformanceTracker
  2. Stage 1-7 完全実装

    • Stage 1: headline要素 ✅
    • Stage 2: paragraph要素 ✅
    • Stage 3: ulist, olist, dlist要素 ✅
    • Stage 4: table要素 ✅
    • Stage 5: image, indepimage, numberlessimage要素 ✅
    • Stage 6: list, emlist, cmd, source, listnum, emlistnum要素 ✅
    • Stage 7: 全インライン要素(既存AST経由で自動対応) ✅
  3. AST Node クラス

    • HeadlineNode, ParagraphNode, ListNode, ListItemNode
    • TableNode, ImageNode, CodeBlockNode
    • InlineNode, TextNode, EmbedNode
    • すべてキーワード引数ベースで統一
  4. 支援機能

    • CompilerAdapterによる review-compile の AST 処理抽出
    • SnapshotLocationによる固定行番号管理
    • JSONBuilder でのキャプション配列対応
    • 包括的なテストケースとフィクスチャ

🎉 Phase 2.2.2 完了

全7段階のAST移行が完了しました!

  • Stage 1-7: 全て実装完了 ✅
  • ハイブリッドモード: 完全動作 ✅
  • テストスイート: 全てpass ✅
  • パフォーマンス: 安定動作確認 ✅

今後の改善項目

  1. Stage 4: emtable, imgtable の AST対応(中優先度)
  2. Stage 3: ネストしたリストの設計改善(中優先度)
  3. 定義リスト: 空<dt>タグの微調整(低優先度)
  4. 全般: パフォーマンス最適化の継続

📖 使用方法

AST機能の詳細な使用方法については、ast-usage.md をご参照ください。

クイックスタート

# config.yml
ast:
  stage: 3  # 推奨開始設定(headline + paragraph + lists)
  debug: true
# コマンドライン実行
review-compile --yaml=config.yml --target=html chapter.re

主要な設定オプション

  • stage: 1-7: 段階的AST移行(1=最小、7=完全)
  • mode: auto|traditional|hybrid: 動作モード
  • debug: true: デバッグログ有効化
  • performance: true: パフォーマンス測定有効化

利点

  1. 保守性向上:構文解析と出力生成の分離
  2. 拡張性向上:AST操作による柔軟な変換
  3. デバッグ支援:中間表現の可視化
  4. 新機能開発:静的解析、最適化等の新機能が容易に
  5. テスタビリティ:各段階での単体テストが可能
  6. JSON出力による外部連携
    • 構文解析結果の外部ツールでの活用
    • CI/CDパイプラインでの文書構造検証
    • エディタープラグインでのリアルタイム解析支援
    • 文書メトリクス収集・分析

フェーズ2実装ガイド

実装の開始手順

1. 最初のタスク(Week 1, Day 1-2)

# ハイブリッドモードの改良から開始
# 現在のast_elementsの動作確認
bundle exec rake test
bundle exec bin/review-compile --target=html samples/sample-book/src/ch01.re

2. 段階的移行のテスト方法

# Stage 1: headline のみAST化のテスト例
# Compilerに ast_elements: [:headline] を指定
# 出力結果が従来と同一であることを確認

3. 各段階での検証項目

  • 機能検証: 出力結果が従来と同一
  • パフォーマンス検証: 処理時間の測定
  • メモリ検証: メモリ使用量の測定
  • 互換性検証: 各Builderでの動作確認

4. 問題発生時の対処方針

  • 従来モードでの動作確認
  • 差分の詳細分析(JSON出力での比較)
  • 必要に応じてAST構造の修正
  • テストケースの追加・修正

成功基準

フェーズ2完了の判定基準

  1. 全要素のAST化完了: 7つのStageすべてでAST経由処理が可能
  2. 回帰テストpass: 既存の全テストケースが成功
  3. 出力同一性: 各Builderで従来と同じ出力結果
  4. パフォーマンス基準: 処理時間の劣化が10%以内
  5. メモリ基準: メモリ使用量の増加が20%以内

各Stageの完了判定

  • 該当要素のAST処理実装完了
  • 単体テスト追加・pass
  • 回帰テストpass
  • パフォーマンス測定完了
  • 次Stageへの移行可否判定

次のフェーズへの移行条件

フェーズ3への移行は以下の条件をすべて満たした場合:

  • フェーズ2の全タスク完了
  • 安定性確認期間(1週間)での問題なし
  • パフォーマンス・品質基準達成
  • チームでの移行可否判定会議での承認

注意点

  1. パフォーマンス:中間表現生成のオーバーヘッド
  2. メモリ使用量:ASTノードによる使用量増加
  3. 複雑性:アーキテクチャの複雑化
  4. 移行期間:段階的移行中の保守コスト
  5. テスト負荷:各段階での包括的テストの実行コスト

Re:VIEW AST Mode仕様書

概要

Re:VIEWのAST(Abstract Syntax Tree)modeは、従来の直接Builder呼び出し方式から、共通のAST構造を経由する処理方式への段階的移行を可能にします。

AST Mode の種類

1. auto mode (デフォルト)

  • 動作: 出力形式に応じて自動的にAST modeを決定
  • JSON出力: 自動的にFull AST modeで処理
  • その他の出力: Traditional mode (AST未使用)
  • 用途: 通常の使用で、互換性を保ちながらJSON出力の品質を向上
ast:
  mode: "auto"  # または未指定

2. full mode

  • 動作: 全ての要素をAST経由で処理
  • 利点: 完全な構造解析、位置情報の正確性
  • 用途: 新機能開発、デバッグ、AST解析ツール
  • パフォーマンス: 若干のオーバーヘッドあり
ast:
  mode: "full"

3. hybrid mode

  • 動作: 指定した要素のみAST経由、その他は従来方式
  • 利点: 段階的移行、リスクの最小化
  • 用途: AST化の段階的導入、特定要素のみの解析
  • 設定方法: elements配列またはstageで指定
ast:
  mode: "hybrid"
  elements: [headline, paragraph]  # 個別指定
  # または
  stage: 2  # ステージ指定

4. off mode

  • 動作: AST処理を完全に無効化
  • 利点: 最高のパフォーマンス、従来と同一の動作
  • 用途: パフォーマンス重視、レガシー互換性が必要な場合
ast:
  mode: "off"

Hybrid Mode の要素指定

Stage指定による段階的移行

事前定義された7つのステージで段階的にAST化を進めることができます:

Stage 対象要素 説明
1 headline 見出しのみ
2 headline, paragraph 見出し + 段落
3 headline, paragraph, ulist, olist, dlist + リスト
4 headline, paragraph, ulist, olist, dlist, table + 表
5 headline, paragraph, ulist, olist, dlist, table, image + 画像
6 headline, paragraph, ulist, olist, dlist, table, image, list, emlist, cmd, source + コードブロック
7 headline, paragraph, ulist, olist, dlist, table, image, list, emlist, cmd, source, inline + インライン要素
ast:
  mode: "hybrid"
  stage: 3  # Stage 3まで段階的に移行

個別要素指定

特定の要素のみを指定してAST化することも可能です:

ast:
  mode: "hybrid"
  elements: [headline, table, image]  # 個別指定

指定可能な要素

ブロック要素:

  • headline - 見出し
  • paragraph - 段落
  • ulist - 箇条書きリスト
  • olist - 番号付きリスト
  • dlist - 定義リスト
  • table - 表
  • image - 画像
  • list - リスト (//list)
  • emlist - リスト (//emlist)
  • cmd - コマンド (//cmd)
  • source - ソース (//source)

インライン要素:

  • inline - 全てのインライン要素 (@, @等)

設定方法

1. 設定ファイル (config.yml)

# AST Mode 設定
ast:
  mode: "hybrid"        # auto/full/hybrid/off
  stage: 2             # 移行ステージ (1-7)
  elements: []         # 個別要素指定 (stage指定時は無視)
  debug: false         # デバッグログ出力
  performance: false   # パフォーマンス測定

2. 環境変数

環境変数は設定ファイルの値をオーバーライドします:

# AST Mode制御
export REVIEW_AST_MODE="hybrid"           # auto/full/hybrid/off
export REVIEW_AST_STAGE="3"              # 1-7
export REVIEW_AST_ELEMENTS="headline,paragraph,table"  # カンマ区切り

# デバッグ・測定
export REVIEW_DEBUG_AST="true"           # デバッグログ有効化
export REVIEW_AST_PERFORMANCE="true"     # パフォーマンス測定有効化

3. コマンドライン使用例

# 設定ファイル使用
bundle exec bin/review-compile --yaml=config.yml --target=html chapter.re

# 環境変数で制御
REVIEW_AST_STAGE=2 REVIEW_DEBUG_AST=true \
  bundle exec bin/review-compile --target=html chapter.re

# JSON出力 (自動的にFull AST mode)
bundle exec bin/review-compile --target=json chapter.re

デバッグ機能

デバッグログ

REVIEW_DEBUG_AST=true または ast.debug: true で有効化:

DEBUG: ASTCompiler: Hybrid mode enabled for elements: [headline, paragraph]
DEBUG: Element headline: AST mode
DEBUG: Element paragraph: AST mode
DEBUG: Element list: TRADITIONAL mode
DEBUG: === AST Element Usage Statistics ===
DEBUG:   headline: 3 times (AST mode)
DEBUG:   paragraph: 5 times (AST mode)
DEBUG:   list: 2 times (TRADITIONAL mode)
DEBUG: ====================================

パフォーマンス測定

REVIEW_AST_PERFORMANCE=true または ast.performance: true で有効化:

DEBUG: === Performance Statistics ===
DEBUG:   total_compilation_time: 15.32ms
DEBUG: ================================

プログラマティック利用

ASTConfigクラス

require 'review/ast_config'

# 設定の読み込み
config = ReVIEW::Configure.values
ast_config = ReVIEW::ASTConfig.new(config)

# 設定の確認
puts ast_config.ast_mode        # :hybrid
puts ast_config.ast_elements    # [:headline, :paragraph]
puts ast_config.ast_stage       # 2
puts ast_config.debug_enabled?  # true

# コンパイラオプションの生成
options = ast_config.compiler_options
# => {ast_mode: true, ast_elements: [:headline, :paragraph]}

# コンパイラの作成
compiler = ReVIEW::Compiler.new(builder, **options)

ハイブリッドモード設定の確認

# コンパイル時の設定確認
config = compiler.hybrid_mode_config
puts config[:mode]               # :hybrid
puts config[:ast_elements]       # [:headline, :paragraph]
puts config[:debug_enabled]      # true
puts config[:statistics]         # {headline: 3, paragraph: 5, list: 2}

# 統計情報の出力
compiler.log_ast_statistics

パフォーマンス特性

モード別パフォーマンス

Mode 処理速度 メモリ使用量 出力品質
off 最高 最小 標準
auto 良好
hybrid 中〜高 小〜中 良好
full 最高

推奨使用パターン

開発・デバッグ時:

ast:
  mode: "full"
  debug: true
  performance: true

段階的移行時:

ast:
  mode: "hybrid"
  stage: 2  # 段階的に増加
  debug: true

本番環境:

ast:
  mode: "auto"  # または"off"
  debug: false
  performance: false

JSON解析・ツール開発:

ast:
  mode: "full"
  debug: false
  performance: false

注意事項

互換性

  • 出力互換性: AST modeの変更は出力結果に影響しません
  • API互換性: 既存のBuilderクラスはそのまま使用可能
  • 設定互換性: AST設定を追加しても既存の設定は影響なし

制限事項

  • nested要素: 複雑にネストした要素の一部でAST化の制限がある場合があります
  • カスタムBuilder: カスタムBuilderクラスではAST対応が必要な場合があります
  • パフォーマンス: Full AST modeでは5-15%程度の処理時間増加

トラブルシューティング

問題: AST modeが効いていない

# デバッグログで確認
REVIEW_DEBUG_AST=true bundle exec bin/review-compile --target=html file.re

問題: パフォーマンスが悪い

# パフォーマンス測定で確認
REVIEW_AST_PERFORMANCE=true bundle exec bin/review-compile --target=html file.re

問題: 設定が反映されない

  • 環境変数が設定ファイルをオーバーライドすることを確認
  • 設定ファイルのYAML文法エラーを確認
  • ast セクションが正しく設定されているか確認

バージョン情報

  • 対応バージョン: Re:VIEW 5.x以降
  • 設定形式: YAML (config.yml)
  • 環境変数: REVIEW_AST_* 形式
  • API: ReVIEW::ASTConfig クラス

Re:VIEW AST機能 使用方法ガイド

🚀 AST機能の使用方法

Re:VIEWのAST(抽象構文木)機能は、従来の直接Builder呼び出し方式から、共通のAST中間表現を経由する方式に段階的に移行できる機能です。

基本的な使用方法

1. 設定ファイルでの指定

config.yml:

# 段階的AST移行(推奨)
ast:
  mode: auto          # auto, traditional, full のいずれか
  stage: 7            # 1-7の段階指定
  performance: true   # パフォーマンス測定有効化
  debug: false        # デバッグログ無効化

# または具体的な要素指定
ast:
  mode: hybrid
  elements: 
    - headline
    - paragraph
    - ulist
    - olist
    - table
  performance: true

2. コマンドライン実行

# Stage 7(全要素)でAST処理
REVIEW_AST_MODE=auto REVIEW_AST_STAGE=7 review-compile --target=html chapter.re

# デバッグログ付きで実行
REVIEW_DEBUG_AST=true review-compile --yaml=config.yml --target=html chapter.re

# JSON形式でAST構造を出力
review-compile --yaml=config.yml --target=json chapter.re > ast_output.json

3. プログラムでの使用

require 'review'

# AST有効化でのコンパイル
config = ReVIEW::Configure.create
config.ast_mode = true
config.ast_stage = 7  # 全要素をAST経由

builder = ReVIEW::HTMLBuilder.new(config)
compiler = ReVIEW::Compiler.new(builder, ast_mode: true, ast_elements: [:headline, :paragraph, :ulist])

result = compiler.compile(chapter)
puts result

段階的移行ガイド

Stage指定による段階的導入

Stage 対象要素 用途
1 headline 見出し処理のみAST化(最小リスク)
2 headline, paragraph テキスト処理の基本をAST化
3 + ulist, olist, dlist リスト処理もAST化(推奨開始点)
4 + table 表処理も含める
5 + image系 画像処理も含める
6 + コードブロック系 プログラムコード処理も含める
7 全要素 完全AST処理(最大機能)

推奨移行パス

# 1. Stage 3から開始(安全で実用的)
ast:
  stage: 3
  
# 2. 問題なければStage 5に
ast:
  stage: 5
  
# 3. 最終的にStage 7(完全AST)
ast:
  stage: 7

設定オプション詳細

モード設定

ast:
  mode: auto        # 段階的移行モード(推奨)
  # mode: traditional  # 従来モード(AST無効)
  # mode: full         # 完全ASTモード
  # mode: hybrid       # 個別要素指定モード

要素個別指定

ast:
  mode: hybrid
  elements:
    - headline      # 見出し
    - paragraph     # 段落
    - ulist         # 順序なしリスト
    - olist         # 順序付きリスト
    - dlist         # 定義リスト
    - table         #
    - image         # 画像
    - indepimage    # 独立画像
    - numberlessimage # 番号なし画像
    - list          # コードリスト
    - listnum       # 行番号付きコードリスト
    - emlist        # 埋め込みリスト
    - emlistnum     # 行番号付き埋め込みリスト
    - cmd           # コマンド
    - source        # ソースコード

デバッグ・パフォーマンス設定

ast:
  debug: true           # デバッグログ有効化
  performance: true     # パフォーマンス測定有効化

環境変数での制御

# AST モード制御
export REVIEW_AST_MODE=auto          # auto, traditional, full, hybrid
export REVIEW_AST_STAGE=5            # 段階指定(1-7)

# デバッグ制御
export REVIEW_DEBUG_AST=true         # デバッグログ有効化
export REVIEW_AST_PERFORMANCE=true   # パフォーマンス測定有効化

パフォーマンス測定

# パフォーマンス統計を表示
REVIEW_DEBUG_AST=true bundle exec review-compile --yaml=config.yml --target=html chapter.re

# 出力例:
# DEBUG: === Performance Statistics ===
# DEBUG:   total_compilation_time: 2.88ms
# DEBUG: ================================
# 
# DEBUG: === AST Element Usage Statistics ===
# DEBUG:   headline: 4 times (AST mode)
# DEBUG:   paragraph: 12 times (AST mode)
# DEBUG:   ulist: 1 times (AST mode)
# DEBUG: ====================================

JSON出力の活用

AST構造の可視化

# AST構造をJSONで出力
review-compile --target=json chapter.re > ast.json

# 外部ツールでの解析例
jq '.children[] | select(.type=="ListNode") | .list_type' ast.json
jq '.children[] | select(.type=="HeadlineNode") | .caption' ast.json

AST出力例

{
  "type": "DocumentNode",
  "children": [
    {
      "type": "HeadlineNode",
      "level": 1,
      "caption": "第1章 はじめに"
    },
    {
      "type": "ParagraphNode",
      "children": [
        {
          "type": "TextNode",
          "content": "これは "
        },
        {
          "type": "InlineNode",
          "inline_type": "b",
          "args": ["重要な"]
        },
        {
          "type": "TextNode", 
          "content": " 段落です。"
        }
      ]
    },
    {
      "type": "ListNode",
      "list_type": "ul",
      "children": [
        {
          "type": "ListItemNode",
          "level": 1,
          "children": [
            {
              "type": "TextNode",
              "content": "リスト項目1"
            }
          ]
        }
      ]
    }
  ]
}

トラブルシューティング

よくある問題と解決方法

1. 出力が従来と異なる場合

# 従来モードで確認
ast:
  mode: traditional

# 段階的に要素を追加して問題箇所を特定
ast:
  mode: hybrid
  elements: [headline]  # 一つずつ追加

2. パフォーマンスが遅い場合

# パフォーマンス測定で詳細分析
REVIEW_DEBUG_AST=true REVIEW_AST_PERFORMANCE=true review-compile ...

# Stage数を下げて確認
ast:
  stage: 3  # より少ない要素で試す

3. エラーが発生する場合

# デバッグログで詳細確認
REVIEW_DEBUG_AST=true review-compile ...

# 従来モードで同じ文書が正常に処理されるか確認
ast:
  mode: traditional

4. 特定の要素で問題が発生する場合

# 問題のある要素を除外
ast:
  mode: hybrid
  elements:
    - headline
    - paragraph
    # - ulist  # 問題のある要素をコメントアウト

実用的な使用例

1. 既存プロジェクトでの段階的導入

# 第1段階:最小限のAST化
ast:
  stage: 1
  debug: true

# 第2段階:基本要素のAST化
ast:
  stage: 3
  debug: false

# 第3段階:完全AST化
ast:
  stage: 7
  performance: true

2. CI/CDでのAST検証

#!/bin/bash
# AST処理での文書検証スクリプト

# 従来モードでの処理
review-compile --yaml=config-traditional.yml --target=html *.re

# AST モードでの処理
review-compile --yaml=config-ast.yml --target=html *.re

# JSON出力でAST構造の検証
review-compile --yaml=config-ast.yml --target=json *.re | jq '.' > /dev/null

3. 開発環境での活用

# 開発時設定(デバッグ有効)
ast:
  stage: 7
  debug: true
  performance: true
# 本番時設定(最適化重視)
ast:
  stage: 7
  debug: false
  performance: false

制限事項・注意点

現在の制限

  1. 定義リスト: 空の<dt>タグが生成される場合がある
  2. ネストリスト: 複雑なネスト構造で改善余地あり
  3. emtable/imgtable: 未対応(今後対応予定)

互換性

  • 後方互換性: 従来モード(mode: traditional)で完全互換
  • Builder互換性: 全Builderクラス(HTML, LaTeX, EPUB等)で動作
  • 設定互換性: 既存のconfig.ymlはそのまま使用可能

パフォーマンス特性

  • メモリ使用量: AST生成によりわずかに増加
  • 処理速度: 大部分のケースで同等またはわずかに高速
  • 段階的導入: Stage 1-3は特に安定・高速

今後の機能拡張

計画中の機能

  1. emtable/imgtable対応: 追加の表形式サポート
  2. ネストリスト改善: より洗練された構造処理
  3. AST変換API: プログラムでのAST操作機能
  4. プラグインシステム: AST変換ベースの拡張機能

フィードバック

AST機能についての不具合報告や改善提案は、Re:VIEWのGitHubリポジトリまでお願いします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment