# バッチ設計書 6-build:parser

## 概要

本ドキュメントは、Cakefileに定義された `build:parser` タスクの設計仕様を記述したものです。Jisonを使用してCoffeeScriptパーサーのみをビルドします。

### 本バッチの処理概要

`cake build:parser` コマンドは、CoffeeScriptの文法定義（grammar.coffee）からJisonパーサーを生成する特化型タスクです。パーサーの生成のみを行い、他のソースファイルのコンパイルは行いません。

**業務上の目的・背景**：CoffeeScriptコンパイラのパーサーは、Jisonというパーサージェネレータを使用して生成されます。grammar.coffeeファイルには、CoffeeScript言語の文法規則が定義されており、これをJisonで処理することでparser.jsが生成されます。文法規則の変更は頻繁ではないため、パーサー生成のみを独立して実行できることで、開発効率が向上します。他のソースファイルを変更した場合は `build:except-parser` を使用し、文法を変更した場合にのみこのタスクを使用できます。

**バッチの実行タイミング**：随時（手動実行）。CoffeeScript言語の文法（grammar.coffee）を変更した後に実行します。

**主要な処理内容**：
1. utilモジュールをglobalスコープに拡張
2. Jisonモジュールのロード
3. lib/coffeescript/grammar.jsからパーサールールを読み込み
4. Jisonを使用してパーサーコードを生成
5. lib/coffeescript/parser.jsにパーサーコードを書き出し

**前後の処理との関連**：`build` タスクの一部として呼び出されることが多いですが、単独でも実行可能です。`build:watch` タスクでは、grammar.coffeeの変更時にこのタスクが呼び出されます。

**影響範囲**：lib/coffeescript/parser.jsのみが更新されます。

## バッチ種別

ビルド処理 / パーサー生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | なし（手動実行） |
| 実行曜日 | なし |
| 実行日 | なし |
| トリガー | 手動 / build:watchによる自動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js 6以上 | ビルド実行に必要なランタイム |
| Jisonモジュール | パーサー生成に必要（devDependencies、バージョン~0.4.18） |
| grammar.js | lib/coffeescript/grammar.js（コンパイル済みの文法定義） |

### 実行可否判定

1. Node.jsランタイムの存在確認
2. Jisonモジュールのインストール確認
3. lib/coffeescript/grammar.jsの存在確認

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | cake build:parserは引数を受け付けません |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| lib/coffeescript/grammar.js | JavaScript | コンパイル済みの文法定義（parserプロパティを持つ） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| lib/coffeescript/parser.js | JavaScript | Jison生成のパーサーコード |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | parser.js |
| 出力先 | lib/coffeescript/ |
| 文字コード | UTF-8 |
| 区切り文字 | なし |

## 処理フロー

### 処理シーケンス

```
1. cake build:parserコマンド実行
   └─ Cakefileのbuild:parserタスクを呼び出し
2. buildParser関数の実行
   └─ helpers.extend(global, require 'util')でグローバル拡張
3. Jisonモジュールのロード
   └─ require 'jison'
4. 文法定義の読み込みとパーサー生成
   └─ require('./lib/coffeescript/grammar').parser.generate()
   └─ moduleMainオプションは空関数
5. パーサーコードの書き出し
   └─ fs.writeFileSync('lib/coffeescript/parser.js', parser)
```

### フローチャート

```mermaid
flowchart TD
    A[cake build:parser] --> B[buildParser関数呼び出し]
    B --> C[helpers.extend: globalにutil拡張]
    C --> D[require jison]
    D --> E[require grammar.js]
    E --> F[parser.generate実行]
    F --> G[moduleMain: 空関数]
    G --> H[fs.writeFileSync]
    H --> I[parser.js生成完了]
```

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

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

本バッチはデータベース操作を行いません。

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 依存エラー | jisonモジュールが未インストール | npm install |
| 1 | 文法エラー | grammar.jsの文法定義が不正 | grammar.coffeeを修正してコンパイル |
| 1 | ファイルエラー | grammar.jsが存在しない | build:except-parserを先に実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

### 障害時対応

- Jisonエラー発生時：grammar.coffeeの文法定義を確認
- grammar.jsが存在しない場合：`cake build:except-parser` でソースをコンパイル
- 生成されたパーサーが動作しない場合：git checkoutで復元

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし |
| コミットタイミング | なし |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1ファイル |
| 目標処理時間 | 1秒未満 |
| メモリ使用量上限 | Node.jsデフォルト制限に従う |

## 排他制御

- 同時実行は推奨されない（parser.jsの競合の可能性）

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| なし | - | build:parserタスク自体はログを出力しない |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | なし | なし |

## 備考

- Jisonは、Bisonに触発されたJavaScript用のパーサージェネレータです
- grammar.coffeeは、CoffeeScript言語の完全な文法を定義しています
- `moduleMain: ->` オプションにより、生成されたパーサーはスタンドアロン実行を想定していません
- パーサーは、レキサー（lexer.coffee）と連携してCoffeeScriptコードを解析します
- `helpers.extend(global, require 'util')` は、Jisonが必要とするユーティリティ関数をグローバルに公開します
- grammar.jsには、`parser` プロパティとしてJison用のパーサー定義オブジェクトがエクスポートされています
