# 機能設計書 92-パーサジェネレータ（Lrama）

## 概要

本ドキュメントは、mrubyに同梱されているパーサジェネレータ「Lrama」の設計を記述する。Lramaは、LALR(1)パーサジェネレータであり、Bison互換の文法定義ファイル（.y）からCソースコードのパーサを生成するツールである。

### 本機能の処理概要

Lramaは、Rubyで実装されたLALR(1)パーサジェネレータである。Bison形式の文法定義ファイル（parse.y）を入力として受け取り、LALR(1)オートマトンを構築し、Cソースコードのパーサ（yacc.c/yacc.h）を出力する。mrubyのコンパイラが使用するパーサ（mrbgems/mruby-compiler内のparse.y）は、このLramaによって処理される。

**業務上の目的・背景**：mrubyのRuby文法パーサはparse.yという文法定義ファイルで記述されており、これをCソースコードに変換するためにパーサジェネレータが必要である。従来はBisonが使われていたが、Lramaは独自の拡張（パラメタライジングルール、IELR、エラーリカバリ等）を提供し、mrubyおよびCRubyの開発においてBisonの代替として使用されている。

**機能の利用シーン**：
- mrubyのビルド時にparse.yからパーサのCソースコードを自動生成
- 文法定義の変更後にパーサを再生成
- パーサの状態オートマトンの解析・デバッグレポートの出力
- Shift/Reduce衝突やReduce/Reduce衝突の検出・解決

**主要な処理内容**：
1. コマンドラインオプションのパース（OptionParser）
2. 文法定義ファイル（.y）の字句解析（Lexer）
3. 文法定義の構文解析（Parser - Racc生成）
4. 標準ライブラリルール（stdlib.y）の統合
5. 文法の準備処理（nullable計算、FIRST集合計算等）
6. LALR(1)オートマトンの構築（LR(0)状態計算、先読み集合計算）
7. IELR状態分割（オプション）
8. パーサテーブルの圧縮・パッキング（Context）
9. ERBテンプレートによるCソースコード生成（Output）
10. 文法バリデーションと診断出力

**関連システム・外部連携**：mruby-compilerのparse.yファイルを入力とし、Cソースコードを出力する。ビルドシステム（Rakefile）から呼び出される。テンプレートファイル（bison/yacc.c、bison/yacc.h）を使用してBison互換の出力を生成する。

**権限による制御**：特になし。コマンドラインツールとして実行される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | コマンドライン | 主画面 | `lrama [options] FILE` コマンドで実行 |

## 機能種別

コード生成処理 / パーサ生成処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| FILE | String | Yes | 文法定義ファイル（.y）のパス | ファイルが存在すること |
| -S/--skeleton | String | No | 使用するスケルトンファイル（デフォルト: bison/yacc.c） | - |
| -o/--output | String | No | 出力ファイル名（デフォルト: y.tab.c） | - |
| -H/--header | String | No | ヘッダファイル出力（.hファイル生成） | - |
| -d | Boolean | No | ヘッダファイルも生成 | - |
| -t/--debug | Boolean | No | 内部パーサのデバッグ出力 | - |
| -D/--define | Array | No | '%define NAME VALUE'と同等の定義 | - |
| -r/--report | Array | No | オートマトンの詳細レポート出力 | states/itemsets/lookaheads/solved/counterexamples/rules/terms/verbose/all/none |
| --report-file | String | No | レポート出力先ファイル | - |
| --trace | Array | No | トレースログ出力 | automaton/closure/rules/only-explicit-rules/actions/time/all/none |
| -v/--verbose | Boolean | No | 詳細出力（--report=stateと同等） | - |
| -W/--warnings | Boolean | No | 警告の表示 | - |
| -e | Boolean | No | エラーリカバリの有効化 | - |
| -V/--version | Boolean | No | バージョン情報出力 | - |

### 入力データソース

- 文法定義ファイル（.yファイル）：Bison形式の文法記述
- 標準ライブラリファイル（stdlib.y）：組み込みパラメタライジングルール
- テンプレートファイル（bison/yacc.c、bison/yacc.h）：出力テンプレート

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| パーサソース | テキストファイル(C source) | LALR(1)パーサのCソースコード（デフォルト: y.tab.c） |
| ヘッダファイル | テキストファイル(C header) | パーサのヘッダファイル（-H/-dオプション指定時） |
| レポートファイル | テキストファイル | オートマトンの状態レポート（-rオプション指定時） |

### 出力先

- パーサソース: -oオプションで指定（デフォルト: y.tab.c）
- ヘッダファイル: -Hオプションで指定（デフォルト: 出力ファイル名.h）
- レポートファイル: --report-fileで指定（デフォルト: 文法ファイル名.output）

## 処理フロー

### 処理シーケンス

```
1. コマンドライン引数のパース (OptionParser)
   └─ オプション検証、ファイルパス設定
2. 文法ファイルの読み込み
   └─ options.y.read でテキスト取得
3. 文法ファイルの解析 (Parser.new.parse)
   ├─ Lexer: 字句解析（トークン分割）
   └─ Parser: 構文解析（Raccベース、Grammarオブジェクト構築）
4. 標準ライブラリ統合
   ├─ stdlib.yの解析
   └─ grammar.insert_before_parameterizing_rules
5. 文法の準備処理 (grammar.prepare)
   ├─ resolve_inline_rules: インラインルール展開
   ├─ normalize_rules: $acceptルール追加、ルール正規化
   ├─ collect_symbols: ルールからシンボル収集
   ├─ set_lhs_and_rhs: LHS/RHS設定
   ├─ fill_default_precedence: デフォルト優先度設定
   ├─ fill_symbols: シンボル番号付与・型情報設定
   ├─ fill_sym_to_rules: シンボル→ルールマッピング
   ├─ compute_nullable: nullable計算
   ├─ compute_first_set: FIRST集合計算
   └─ set_locations: ロケーション情報設定
6. 文法バリデーション (grammar.validate!)
   └─ LHSが非終端記号であることを検証
7. LALR(1)状態計算 (States.new.compute)
   ├─ compute_lr0_states: LR(0)状態構築
   ├─ compute_direct_read_sets: DR集合計算
   ├─ compute_reads_relation: Reads関係計算
   ├─ compute_read_sets: Read集合計算（Digraphアルゴリズム）
   ├─ compute_includes_relation: Includes関係計算
   ├─ compute_lookback_relation: Lookback関係計算
   ├─ compute_follow_sets: Follow集合計算（Digraphアルゴリズム）
   ├─ compute_look_ahead_sets: LA集合計算
   ├─ compute_conflicts: Shift/Reduce・Reduce/Reduce衝突検出
   └─ compute_default_reduction: デフォルトリダクション計算
8. IELR状態分割（オプション、grammar.ielr_defined?時）
   └─ states.compute_ielr
9. パーサテーブル構築 (Context.new)
   ├─ compute_yydefact: デフォルトアクション計算
   ├─ compute_yydefgoto: デフォルトGOTO計算
   ├─ sort_actions: アクションソート
   └─ compute_packed_table: テーブル圧縮・パッキング
10. レポート出力（オプション）
    └─ StatesReporter.report / TraceReporter.report
11. Cソース生成 (Output.new.render)
    ├─ ERBテンプレート（bison/yacc.c）の評価
    ├─ ヘッダテンプレート（bison/yacc.h）の評価（オプション）
    └─ 特殊変数（@oline@、@ofile@）の置換
12. バリデーション・診断
    ├─ GrammarValidator: 衝突数が期待値以内か検証
    └─ Diagnostics: 警告出力（衝突、再定義パラメタライジングルール）
```

### フローチャート

```mermaid
flowchart TD
    A[lrama FILE 実行] --> B[OptionParser.parse]
    B --> C[文法ファイル読み込み]
    C --> D[Parser.parse - 文法解析]
    D --> E{no_stdlib?}
    E -->|No| F[stdlib.y解析・統合]
    E -->|Yes| G[grammar.prepare]
    F --> G
    G --> H[grammar.validate!]
    H --> I[States.compute - LALR状態計算]
    I --> J{ielr_defined?}
    J -->|Yes| K[States.compute_ielr]
    J -->|No| L[Context.new - テーブル構築]
    K --> L
    L --> M{report_file?}
    M -->|Yes| N[StatesReporter.report]
    M -->|No| O[Output.render - Cソース生成]
    N --> O
    O --> P[GrammarValidator.valid?]
    P --> Q[Diagnostics.run]
    Q --> R[完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-92-01 | LALR(1)構築 | DeRemer&Pennelloのアルゴリズムに基づきLALR(1)先読み集合を効率的に計算する | 常時 |
| BR-92-02 | Shift/Reduce衝突解決 | 優先度・結合性に基づきS/R衝突を自動解決。%left→Reduce優先、%right→Shift優先、%nonassoc→エラー | S/R衝突発生時 |
| BR-92-03 | デフォルトリダクション | 衝突がなく、errorシンボルへのshiftがない状態で最頻度のreduceをデフォルトとする | 各状態の計算時 |
| BR-92-04 | テーブル圧縮 | Bisonと同等のテーブルパッキングアルゴリズムでパーサテーブルを圧縮する | テーブル生成時 |
| BR-92-05 | 標準ライブラリ統合 | %no-stdlib指定がない限りstdlib.yのパラメタライジングルールを自動追加する | 文法準備時 |
| BR-92-06 | IELR対応 | %define lr.type 'ielr'指定時にIELR状態分割を実行する | IELR定義時 |
| BR-92-07 | 期待衝突数検証 | %expectで指定された期待S/R衝突数と実際の衝突数を比較し不一致ならエラー | バリデーション時 |
| BR-92-08 | Bison互換出力 | ERBテンプレートによりBison互換のyacc.c/yacc.hを生成する | 出力生成時 |

### 計算ロジック

**LALR(1)先読み集合計算（DeRemer&Pennello 1982アルゴリズム）**:
1. DR(p,A) = {t | p -(A)-> r -(t)->} : 直接Read集合
2. (p,A) reads (r,C) iff p -(A)-> r -(C)-> and C =>* e : Reads関係
3. Read(p,A) = DR(p,A) + Union{Read(r,C) | (p,A) reads (r,C)} : Read集合（Digraph）
4. (p,A) includes (p',B) iff B -> bAg, g =>* e, p' -(b)-> p : Includes関係
5. Follow(p,A) = Read(p,A) + Union{Follow(p',B) | (p,A) includes (p',B)} : Follow集合（Digraph）
6. (q, A->w) lookback (p,A) iff p -(w)-> q : Lookback関係
7. LA(q, A->w) = Union{Follow(p,A) | (q,A->w) lookback (p,A)} : LA集合

**テーブル圧縮**:
- yydefact: 各状態のデフォルトアクション（最頻reductionのrule_id+1、またはエラー時0）
- yydefgoto: 各非終端記号のデフォルトGOTO（最頻遷移先状態ID）
- yytable/yycheck: パッキングされたアクション/GOTOテーブル
- yypact_ninf/yytable_ninf: 特殊な負の無限大値

## データベース操作仕様

### 操作別データベース影響一覧

該当なし（データベースを使用しない）。

### テーブル別操作詳細

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ParseError | 文法ファイルの構文エラー | エラーメッセージを表示してabort |
| - | ValidationError | LHSが終端記号 | エラーメッセージを表示してabort |
| - | ConflictError | S/R衝突数が%expect値と不一致 | exit false（非ゼロ終了） |
| - | InvalidOption | 無効なreportまたはtraceオプション | "Invalid report/trace option"を表示してabort |
| - | FileNotFound | 文法ファイルが見つからない | "File should be specified"を表示してabort |

### リトライ仕様

リトライは不要（コード生成ツールのため）。

## トランザクション仕様

該当なし。

## パフォーマンス要件

- Digraphアルゴリズムにより先読み集合計算はO(n)の時間計算量（nはノード数+エッジ数）
- Report::Durationモジュールにより各フェーズの所要時間を計測可能（--trace=timeオプション）
- テーブルパッキングはBisonと同等の圧縮率を実現

## セキュリティ考慮事項

- 入力は文法定義ファイル（.y）のみであり、外部ネットワークアクセスは行わない
- 生成されるCソースコードはコンパイル前の中間成果物であり、直接実行されない

## 備考

- Lramaバージョン: 0.7.0
- Raccにより自動生成されたパーサ（parser.rb）を内部で使用
- Bison互換のテンプレート（bison/yacc.c、bison/yacc.h）を使用
- 反例生成（counterexamples）機能により衝突の原因分析が可能
- パラメタライジングルール（%rule）によるルールの再利用が可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

Lramaの中心となるデータ構造はGrammar（文法）、State（状態）、Context（テーブル）の3つである。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | grammar.rb | `tools/lrama/lib/lrama/grammar.rb` | Grammarクラス: パース結果の文法表現。rules, symbols, percent_codes等を保持 |
| 1-2 | symbol.rb | `tools/lrama/lib/lrama/grammar/symbol.rb` | Symbolクラス: 終端記号・非終端記号の表現。precedence, nullable, first_set等 |
| 1-3 | rule.rb | `tools/lrama/lib/lrama/grammar/rule.rb` | Ruleクラス: 文法ルール（LHS, RHS, token_code等） |
| 1-4 | state.rb | `tools/lrama/lib/lrama/state.rb` | Stateクラス: LR(0)状態。kernels, closure, shifts, reduces, conflicts等 |
| 1-5 | options.rb | `tools/lrama/lib/lrama/options.rb` | Optionsクラス: コマンドラインオプションの格納。skeleton, outfile, header_file等 |
| 1-6 | token.rb | `tools/lrama/lib/lrama/lexer/token.rb` | Tokenクラス: 字句解析トークン。Tag, Ident, Char, UserCode等のサブクラス |

**読解のコツ**: Lramaはモジュール `Lrama` 配下に全クラスを配置している。`Grammar`がパース結果、`States`が状態オートマトン、`Context`がテーブル変換後のデータを保持する。このデータの変換パイプラインを意識すると全体構造が理解しやすい。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | lrama (exe) | `tools/lrama/exe/lrama` | エントリーポイント。Command.new.run(ARGV.dup)を呼び出す |
| 2-2 | command.rb | `tools/lrama/lib/lrama/command.rb` | Commandクラス: メイン処理フロー全体を統括 |

**主要処理フロー**:
1. **10行目**: `options = OptionParser.new.parse(argv)` - コマンドライン引数パース
2. **19行目**: `text = options.y.read` - 文法ファイルの読み込み
3. **22行目**: `grammar = Lrama::Parser.new(text, ...).parse` - 文法の構文解析
4. **23-26行目**: stdlib.yの解析・統合（no_stdlibでない場合）
5. **27行目**: `grammar.prepare` - 文法の準備処理
6. **28行目**: `grammar.validate!` - 文法バリデーション
7. **35行目**: `states = Lrama::States.new(grammar, ...)` - 状態オブジェクト生成
8. **36行目**: `states.compute` - LALR(1)オートマトン構築
9. **37行目**: `states.compute_ielr` - IELR状態分割（条件付き）
10. **38行目**: `context = Lrama::Context.new(states)` - テーブル構築
11. **50-61行目**: `Lrama::Output.new(...).render` - Cソース生成
12. **64行目**: `Lrama::GrammarValidator.new(...).valid?` - バリデーション
13. **65行目**: `Lrama::Diagnostics.new(...).run(...)` - 診断出力

#### Step 3: 字句解析を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | lexer.rb | `tools/lrama/lib/lrama/lexer.rb` | Lexerクラス: StringScannerベースの字句解析器 |
| 3-2 | grammar_file.rb | `tools/lrama/lib/lrama/lexer/grammar_file.rb` | GrammarFileクラス: 入力ファイルの抽象化 |

**主要処理フロー**:
- **14行目**: SYMBOLS定数 - '%{', '%%', '{', '}' 等の特殊記号
- **15-45行目**: PERCENT_TOKENS定数 - %union, %token, %type等のBisonディレクティブ
- **56-63行目**: `next_token` - 状態（:initial / :c_declaration）に応じたトークン読み取り
- **77-126行目**: `lex_token` - 通常モードでのトークン解析（記号、タグ、文字、整数、識別子）
- **128-165行目**: `lex_c_code` - Cコードブロックの解析（ネスト対応の括弧マッチング）

#### Step 4: 文法構造とLALR状態計算を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | grammar.rb | `tools/lrama/lib/lrama/grammar.rb` | prepare()メソッド（146-157行目）: 文法準備の全ステップ |
| 4-2 | states.rb | `tools/lrama/lib/lrama/states.rb` | States#compute（82-97行目）: LALR(1)計算の全ステップ |
| 4-3 | digraph.rb | `tools/lrama/lib/lrama/digraph.rb` | Digraphアルゴリズム: Read集合・Follow集合の効率的計算 |

**主要処理フロー**:
- **Grammar#compute_nullable（181-228行目）**: 全ルールのnullable属性を反復計算
- **Grammar#compute_first_set（230-263行目）**: FIRST集合をビットマップで反復計算
- **States#compute_lr0_states（263-292行目）**: 初期状態からBFS的にLR(0)状態を構築
- **States#setup_state（207-250行目）**: クロージャ計算とshift/reduce計算
- **States#compute_direct_read_sets（307-320行目）**: DR集合をビットマップで計算
- **States#compute_conflicts（439-531行目）**: S/R衝突・R/R衝突の検出と優先度解決

#### Step 5: テーブル構築と出力を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | context.rb | `tools/lrama/lib/lrama/context.rb` | Contextクラス: パーサテーブルの計算・圧縮 |
| 5-2 | output.rb | `tools/lrama/lib/lrama/output.rb` | Outputクラス: ERBテンプレートによるCソース生成 |
| 5-3 | yacc.c | `tools/lrama/template/bison/yacc.c` | Cパーサテンプレート（ERB形式） |

**主要処理フロー**:
- **Context#compute_yydefact（210-287行目）**: 各状態のデフォルトアクション計算とアクション配列構築
- **Context#compute_yydefgoto（289-334行目）**: 非終端記号のデフォルトGOTO計算
- **Context#compute_packed_table（399-497行目）**: テーブルパッキング（yytable, yycheck, base配列の構築）
- **Output#render（49-64行目）**: ERBテンプレート評価とヘッダ生成
- **Output#user_actions（240-261行目）**: ユーザ定義アクション（ルールのCコード）の出力

#### Step 6: バリデーション・診断を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | grammar_validator.rb | `tools/lrama/lib/lrama/grammar_validator.rb` | GrammarValidatorクラス: 衝突数の検証 |
| 6-2 | diagnostics.rb | `tools/lrama/lib/lrama/diagnostics.rb` | Diagnosticsクラス: 警告出力 |
| 6-3 | states_reporter.rb | `tools/lrama/lib/lrama/states_reporter.rb` | StatesReporterクラス: 状態レポート出力 |

**主要処理フロー**:
- **GrammarValidator#valid?（11-13行目）**: %expectによる期待衝突数との比較
- **Diagnostics#run（11-15行目）**: 衝突警告とパラメタライジングルール再定義警告
- **StatesReporter#_report（19-25行目）**: 未使用ルール、未使用端末記号、衝突、文法、状態の各レポート

### プログラム呼び出し階層図

```
exe/lrama
    |
    +-- Lrama::Command#run (command.rb:8)
            |
            +-- Lrama::OptionParser#parse (option_parser.rb:14)
            |
            +-- Lrama::Parser#parse (parser.rb) [Raccベース]
            |       +-- Lrama::Lexer#next_token (lexer.rb:56)
            |               +-- lex_token (lexer.rb:77)
            |               +-- lex_c_code (lexer.rb:128)
            |
            +-- Lrama::Grammar#prepare (grammar.rb:146)
            |       +-- resolve_inline_rules (301-311)
            |       +-- normalize_rules (313-329)
            |       +-- compute_nullable (181-228)
            |       +-- compute_first_set (230-263)
            |
            +-- Lrama::Grammar#validate! (162-165)
            |
            +-- Lrama::States#compute (states.rb:82)
            |       +-- compute_lr0_states (263-292)
            |       |       +-- create_state (161-205)
            |       |       +-- setup_state (207-250)
            |       +-- compute_direct_read_sets (307-320)
            |       +-- compute_reads_relation (322-336)
            |       +-- compute_read_sets (338-344)
            |       |       +-- Digraph#compute (digraph.rb:50)
            |       +-- compute_includes_relation (356-379)
            |       +-- compute_lookback_relation (381-394)
            |       +-- compute_follow_sets (396-401)
            |       |       +-- Digraph#compute (digraph.rb:50)
            |       +-- compute_look_ahead_sets (404-430)
            |       +-- compute_conflicts (439-531)
            |       +-- compute_default_reduction (533-547)
            |
            +-- Lrama::Context.new (context.rb:16)
            |       +-- compute_yydefact (210-287)
            |       +-- compute_yydefgoto (289-334)
            |       +-- sort_actions (336-367)
            |       +-- compute_packed_table (399-497)
            |
            +-- Lrama::StatesReporter#report (states_reporter.rb:11)
            |
            +-- Lrama::Output#render (output.rb:49)
            |       +-- eval_template (407-409)
            |       +-- render_template (412-415)
            |       +-- replace_special_variables (451-457)
            |
            +-- Lrama::GrammarValidator#valid? (grammar_validator.rb:11)
            +-- Lrama::Diagnostics#run (diagnostics.rb:11)
```

### データフロー図

```
[入力]                     [処理]                              [出力]

parse.y ──────────────▶ Lexer ──▶ Parser ──▶ Grammar
                                                |
stdlib.y ─────────────▶ Parser ──────────────▶ |（統合）
                                                |
                                    Grammar#prepare
                                    (nullable, FIRST集合)
                                                |
                                    States#compute
                                    (LR(0), LALR(1))
                                                |
                                    Context.new
                                    (テーブル圧縮)
                                                |
template/bison/yacc.c ──▶ Output#render ──────▶ y.tab.c (パーサソース)
template/bison/yacc.h ──▶ Output#render ──────▶ *.h (ヘッダファイル)
                                                |
                          StatesReporter ──────▶ *.output (レポート)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lrama | `tools/lrama/exe/lrama` | 実行ファイル | エントリーポイント |
| lrama.rb | `tools/lrama/lib/lrama.rb` | ソース | モジュール定義・require集約 |
| command.rb | `tools/lrama/lib/lrama/command.rb` | ソース | メイン処理フロー |
| option_parser.rb | `tools/lrama/lib/lrama/option_parser.rb` | ソース | コマンドラインオプション解析 |
| options.rb | `tools/lrama/lib/lrama/options.rb` | ソース | オプションデータクラス |
| lexer.rb | `tools/lrama/lib/lrama/lexer.rb` | ソース | 字句解析器 |
| token.rb | `tools/lrama/lib/lrama/lexer/token.rb` | ソース | トークンクラス群 |
| location.rb | `tools/lrama/lib/lrama/lexer/location.rb` | ソース | ソース位置情報 |
| grammar_file.rb | `tools/lrama/lib/lrama/lexer/grammar_file.rb` | ソース | 入力ファイル抽象化 |
| parser.rb | `tools/lrama/lib/lrama/parser.rb` | 生成ソース | Raccで生成された構文解析器 |
| grammar.rb | `tools/lrama/lib/lrama/grammar.rb` | ソース | 文法データ構造 |
| symbol.rb | `tools/lrama/lib/lrama/grammar/symbol.rb` | ソース | シンボル定義 |
| symbols.rb | `tools/lrama/lib/lrama/grammar/symbols.rb` | ソース | シンボルコレクション |
| rule.rb | `tools/lrama/lib/lrama/grammar/rule.rb` | ソース | ルール定義 |
| rule_builder.rb | `tools/lrama/lib/lrama/grammar/rule_builder.rb` | ソース | ルール構築器 |
| precedence.rb | `tools/lrama/lib/lrama/grammar/precedence.rb` | ソース | 優先度定義 |
| code.rb | `tools/lrama/lib/lrama/grammar/code.rb` | ソース | アクションコード |
| binding.rb | `tools/lrama/lib/lrama/grammar/binding.rb` | ソース | パラメータバインディング |
| parameterizing_rule.rb | `tools/lrama/lib/lrama/grammar/parameterizing_rule.rb` | ソース | パラメタライジングルール |
| stdlib.y | `tools/lrama/lib/lrama/grammar/stdlib.y` | 文法定義 | 標準ライブラリルール |
| state.rb | `tools/lrama/lib/lrama/state.rb` | ソース | LR状態 |
| states.rb | `tools/lrama/lib/lrama/states.rb` | ソース | LALR状態集合・先読み計算 |
| item.rb | `tools/lrama/lib/lrama/states/item.rb` | ソース | LRアイテム |
| context.rb | `tools/lrama/lib/lrama/context.rb` | ソース | パーサテーブル計算 |
| output.rb | `tools/lrama/lib/lrama/output.rb` | ソース | Cソース出力 |
| digraph.rb | `tools/lrama/lib/lrama/digraph.rb` | ソース | Digraphアルゴリズム（集合計算） |
| bitmap.rb | `tools/lrama/lib/lrama/bitmap.rb` | ソース | ビットマップ操作 |
| grammar_validator.rb | `tools/lrama/lib/lrama/grammar_validator.rb` | ソース | 文法バリデーション |
| diagnostics.rb | `tools/lrama/lib/lrama/diagnostics.rb` | ソース | 診断・警告出力 |
| states_reporter.rb | `tools/lrama/lib/lrama/states_reporter.rb` | ソース | 状態レポート出力 |
| trace_reporter.rb | `tools/lrama/lib/lrama/trace_reporter.rb` | ソース | トレースレポート出力 |
| counterexamples.rb | `tools/lrama/lib/lrama/counterexamples.rb` | ソース | 反例生成 |
| version.rb | `tools/lrama/lib/lrama/version.rb` | ソース | バージョン定義（0.7.0） |
| logger.rb | `tools/lrama/lib/lrama/logger.rb` | ソース | ログ出力 |
| report.rb | `tools/lrama/lib/lrama/report.rb` | ソース | レポートモジュール |
| duration.rb | `tools/lrama/lib/lrama/report/duration.rb` | ソース | 処理時間計測 |
| yacc.c | `tools/lrama/template/bison/yacc.c` | テンプレート | Cパーサ出力テンプレート（ERB形式） |
| yacc.h | `tools/lrama/template/bison/yacc.h` | テンプレート | Cヘッダ出力テンプレート（ERB形式） |
| _yacc.h | `tools/lrama/template/bison/_yacc.h` | テンプレート | ヘッダ部分テンプレート |
| NEWS.md | `tools/lrama/NEWS.md` | ドキュメント | 変更履歴 |
| LEGAL.md | `tools/lrama/LEGAL.md` | ドキュメント | ライセンス情報 |
| MIT | `tools/lrama/MIT` | ライセンス | MITライセンス |
