# バッチ設計書 7-build:except-parser

## 概要

本ドキュメントは、Cakefileに定義された `build:except-parser` タスクの設計仕様を記述したものです。Jisonパーサーを除くCoffeeScriptコンパイラのソースをビルドします。

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

`cake build:except-parser` コマンドは、src/ディレクトリ配下のCoffeeScriptソースファイルをJavaScriptにコンパイルしますが、パーサーの再生成は行いません。これにより、文法を変更していない場合に高速なビルドが可能です。

**業務上の目的・背景**：CoffeeScriptコンパイラの開発において、文法（grammar.coffee）の変更は比較的まれです。パーサーの生成にはJisonの処理が必要で時間がかかるため、文法以外のソースファイル（lexer、nodes、helpers等）のみを変更した場合は、パーサー生成をスキップすることでビルド時間を短縮できます。`build:watch` タスクでは、変更されたファイルがgrammar.coffeeでない場合にこのタスクが使用されます。

**バッチの実行タイミング**：随時（手動実行）。コンパイラのソースコード（grammar.coffee以外）を変更した後に実行します。`build:watch` タスクによる自動実行時にも使用されます。

**主要な処理内容**：
1. src/ディレクトリ内のファイル一覧を取得
2. .coffeeおよび.litcoffee拡張子のファイルをフィルタリング
3. coffeeコマンドで各ファイルをJavaScriptにコンパイル
4. lib/coffeescript/ディレクトリに出力

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

**影響範囲**：lib/coffeescript/配下のJavaScriptファイル（parser.jsを除く）が更新されます。

## バッチ種別

ビルド処理 / コンパイル

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js 6以上 | ビルド実行に必要なランタイム |
| 既存コンパイラ | lib/coffeescript/配下の動作するコンパイラ（セルフコンパイル用） |
| ソースファイル | src/配下のCoffeeScriptソースファイル |

### 実行可否判定

1. Node.jsランタイムの存在確認
2. bin/coffeeの存在確認
3. src/ディレクトリの存在確認

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| src/*.coffee | CoffeeScript | コンパイラのソースコード |
| src/*.litcoffee | Literate CoffeeScript | リテレートスタイルのソースコード（scope.litcoffee等） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| lib/coffeescript/*.js | JavaScript | コンパイル済みコンパイラモジュール（parser.jsを除く） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 元ファイル名の拡張子を.jsに変更 |
| 出力先 | lib/coffeescript/ |
| 文字コード | UTF-8 |
| 区切り文字 | なし |

## 処理フロー

### 処理シーケンス

```
1. cake build:except-parserコマンド実行
   └─ Cakefileのbuild:except-parserタスクを呼び出し
2. buildExceptParser関数の実行
   └─ fs.readdirSync('src')でファイル一覧を取得
3. ファイルフィルタリング
   └─ .coffeeまたは.litcoffee拡張子でフィルタ
   └─ 'src/'プレフィックスを付与
4. coffeeコマンド実行
   └─ run(['-c', '-o', 'lib/coffeescript'].concat(files), callback)
   └─ spawnNodeProcessでbin/coffeeを起動
5. コールバック呼び出し（あれば）
   └─ 完了通知
```

### フローチャート

```mermaid
flowchart TD
    A[cake build:except-parser] --> B[buildExceptParser関数呼び出し]
    B --> C[fs.readdirSync src/]
    C --> D[ファイル一覧取得]
    D --> E[.coffee/.litcoffeeフィルタ]
    E --> F[src/プレフィックス付与]
    F --> G[run関数呼び出し]
    G --> H[spawnNodeProcess]
    H --> I[bin/coffee -c -o lib/coffeescript]
    I --> J[各ファイルコンパイル]
    J --> K{コールバックあり?}
    K -->|Yes| L[コールバック実行]
    K -->|No| M[終了]
    L --> M
```

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

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

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

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 構文エラー | ソースファイルのCoffeeScript構文が不正 | ソースコードを修正 |
| 1 | ファイルエラー | src/ディレクトリが存在しない | プロジェクト構造を確認 |
| 1 | コンパイラエラー | 既存のコンパイラが動作しない | git checkout lib/*で復元 |

### リトライ仕様

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

### 障害時対応

- 構文エラー発生時：エラーメッセージを確認し、該当ソースファイルを修正
- 既存コンパイラが壊れた場合：`git checkout lib/*` で復元
- 部分的にコンパイルが成功した場合：再度実行するか、git checkoutで復元

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし |
| コミットタイミング | なし |
| ロールバック条件 | なし（git checkoutで手動復元） |

## パフォーマンス要件

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

## 排他制御

- 同時実行は推奨されない（出力ファイルの競合の可能性）

## ログ出力

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

## 監視・アラート

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

## 備考

- このタスクは、パーサー生成をスキップすることで `build` タスクよりも高速に実行できます
- `build:watch` タスクでは、変更されたファイルに応じて `build` または `build:except-parser` を選択的に実行します
- ファイル名にgrammar.coffeeが含まれる場合は、`build:parser` も必要です
- coffeeコマンドの `-c` オプションはコンパイルモード、`-o` オプションは出力ディレクトリを指定します
- run関数は、process.exit(1)でエラー時に終了するラッパーです
- 対象ファイル:
  - coffeescript.coffee → coffeescript.js
  - grammar.coffee → grammar.js
  - helpers.coffee → helpers.js
  - lexer.coffee → lexer.js
  - nodes.coffee → nodes.js
  - optparse.coffee → optparse.js
  - rewriter.coffee → rewriter.js
  - scope.litcoffee → scope.js
  - sourcemap.coffee → sourcemap.js
