# 通知設計書 9-decimal_literal_prefix_error

## 概要

本ドキュメントは、CoffeeScriptコンパイラが10進数リテラルに不正なプレフィックス'0'が付いている場合に発生する構文エラー「decimal literal prefix error」の通知仕様を定義する。

### 本通知の処理概要

CoffeeScriptコンパイラのレキサー（字句解析器）において、10進数リテラルが'0'で始まり、かつ8または9を含む場合（例：08、09、0123089）に、構文エラーとして通知を行う処理である。このような数値はC言語や古いJavaScriptでは8進数として解釈される可能性があり、CoffeeScriptでは明示的にエラーとして扱う。

**業務上の目的・背景**：歴史的に、'0'で始まる数値は8進数として解釈されることがあった。しかし、08や09は有効な8進数ではない（8進数は0-7のみ使用可能）。CoffeeScriptはこの曖昧さを排除するため、'0'で始まる10進数を禁止し、開発者に明示的な記法を促す。

**通知の送信タイミング**：レキサーのnumberToken()メソッドにおいて、NUMBER正規表現でマッチした数値リテラルが'0'で始まり、8または9を含む場合に発生する。

**通知の受信者**：CoffeeScriptソースコードをコンパイルしている開発者。

**通知内容の概要**：エラーメッセージとして「decimal literal '{number}' must not be prefixed with '0'」という形式で、問題となった数値リテラルを特定できるようにしている。

**期待されるアクション**：開発者は先頭の'0'を削除して正しい10進数表記に修正する（例：08 → 8）。

## 通知種別

コンパイラ出力（標準エラー出力 / SyntaxError例外）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイル処理中に即座に発生） |
| 優先度 | 高（コンパイルを中断） |
| リトライ | 無（即時エラーとして処理） |

### 送信先決定ロジック

CoffeeScriptコンパイラを呼び出しているコンテキストに依存する。

## 通知テンプレート

### エラーメッセージ形式

| 項目 | 内容 |
|-----|------|
| 形式 | テキスト |

### 本文テンプレート

```
[filename]:[line]:[column]: error: decimal literal '{number}' must not be prefixed with '0'
[source_code_line]
[marker]
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| number | 不正なプレフィックスを持つ数値リテラル | マッチした数値文字列 | Yes |
| filename | ソースファイル名 | コンパイルオプション | No |
| line | エラー発生行番号 | locationData.first_line | Yes |
| column | エラー発生列番号 | locationData.first_column | Yes |
| source_code_line | エラーが発生した行のソースコード | 入力ソースコード | Yes |
| marker | エラー位置を示すマーカー | 計算により生成 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | numberToken()メソッド実行中 | 数値リテラルが/^0\d*[89]/パターンにマッチする場合 | 不正な10進数プレフィックス検出 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| なし | この形式の数値は必ずエラーとなる |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[numberToken開始] --> B[NUMBER正規表現でマッチ]
    B --> C{マッチした?}
    C -->|No| D[0を返す]
    C -->|Yes| E{/^0[BOX]/テスト}
    E -->|Yes| F[radix prefix error]
    E -->|No| G{/^0\d*[89]/テスト}
    G -->|Yes| H[error: decimal literal must not be prefixed with '0']
    G -->|No| I[他のチェック継続]
    H --> J[throwSyntaxError]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし

### 内部データ構造

| 構造名 | 用途 | 備考 |
|--------|------|------|
| NUMBER正規表現 | 数値リテラルのマッチング | lexer.coffee 1309-1318行目で定義 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| SyntaxError | '0'プレフィックス付きの10進数 | 開発者が先頭の'0'を削除 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし

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

- エラーメッセージにはソースコードの一部が含まれる

## 備考

- このエラーは08、09、0123089など、'0'で始まり8または9を含む数値で発生
- 純粋な8進数（0-7のみ）の場合は別のエラー（No.10: octal literal prefix error）が発生
- 正しい表記は先頭の'0'を削除するか、8進数の場合は0oプレフィックスを使用

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lexer.coffee | `src/lexer.coffee` | NUMBER正規表現（1309-1318行目） |

**読解のコツ**: NUMBER正規表現は様々な形式の数値リテラルをマッチするが、大文字小文字は区別しない。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | lexer.coffee | `src/lexer.coffee` | numberToken()メソッド（264-287行目） |

**主要処理フロー**:
1. **265行目**: NUMBER正規表現でマッチを試みる
2. **273-274行目**: /^0\d*[89]/パターンでテストし、マッチすればエラー
3. **274行目**: 「decimal literal '{number}' must not be prefixed with '0'」エラーを発生

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

```
Lexer.tokenize()
    |
    +-- numberToken()
           |
           +-- NUMBER正規表現でマッチ (265行目)
           |
           +-- 大文字プレフィックスチェック (271行目)
           |
           +-- 10進数プレフィックスチェック (273行目)
           |       |
           |       +-- /^0\d*[89]/ テスト
           |               |
           |               +-- [マッチ] error("decimal literal must not be prefixed")
           |                       |
           |                       +-- throwSyntaxError()
           |
           +-- [正常時] トークン生成 (278-286行目)
```

### データフロー図

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

ソースコード  -----> numberToken()      -----> トークンストリーム
    |                     |
    |                     v
    |               NUMBER正規表現マッチ
    |                     |
    |                     v
    |               /^0\d*[89]/テスト
    |                     |
    |              ['0'プレフィックス + 8 or 9]
    |                     |
    |                     v
    +------------> error() + throwSyntaxError()
                          |
                          v
                   SyntaxError例外
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lexer.coffee | `src/lexer.coffee` | ソース | numberToken()と10進数プレフィックスチェック |
| helpers.coffee | `src/helpers.coffee` | ソース | throwSyntaxError関数 |
| numbers.coffee | `test/numbers.coffee` | テスト | 数値リテラルのテスト |
