# 機能設計書 91-構文木定義

## 概要

本ドキュメントは、F#コンパイラにおける構文木（Syntax Tree）の型定義について記述する。構文木はソースコードのパース結果を表現するための核心的なデータ構造であり、コンパイラのフロントエンドからバックエンドまで広く利用される。

### 本機能の処理概要

**業務上の目的・背景**：F#コンパイラはソースコードを解析して最終的にILコードを生成する。この過程で、ソースコードのテキスト表現を構造化されたデータ表現に変換する必要がある。構文木定義はこの変換結果を格納するための型システムを提供し、後続の型チェック、最適化、コード生成の各フェーズで参照される基盤となる。

**機能の利用シーン**：パーサーがソースコードを読み込んで構文解析を行った結果を構文木として構築する際に使用される。また、IDE連携（FSharp.Compiler.Service）においてシンタックスハイライト、インテリセンス、リファクタリング機能の基盤としても利用される。

**主要な処理内容**：
1. 識別子（Ident）の定義 - ソースコード内の名前とその位置情報を保持
2. 定数（SynConst）の定義 - リテラル値（数値、文字列、ブール値等）を表現
3. 型（SynType）の定義 - 型注釈や型パラメータを表現
4. 式（SynExpr）の定義 - プログラムの実行ロジックを表現
5. パターン（SynPat）の定義 - パターンマッチングの構造を表現
6. 宣言（SynModuleDecl等）の定義 - モジュール、型、関数の宣言を表現

**関連システム・外部連携**：パーサー（pars.fsy）から生成され、型チェッカー（CheckExpressions.fs等）で消費される。FSharp.Compiler.Serviceを通じてVisual StudioやVS Code等のIDEと連携する。

**権限による制御**：該当なし（コンパイラ内部のデータ構造）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | IDE統合 | 参照画面 | シンタックスハイライト、エラー表示 |

## 機能種別

データ構造定義 / 型システム基盤

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ソースコード | string | Yes | パース対象のF#ソースコード | 構文的に正しいこと |

### 入力データソース

パーサー（pars.fsy）からの構文解析結果

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ParsedInput | ParsedInput | パースされた入力全体を表す構文木 |
| SynExpr | SynExpr | 式を表す構文木ノード |
| SynType | SynType | 型を表す構文木ノード |
| SynPat | SynPat | パターンを表す構文木ノード |

### 出力先

型チェッカー、IDE連携サービス

## 処理フロー

### 処理シーケンス

```
1. Ident（識別子）の定義
   └─ テキストと位置情報（range）を保持する構造体
2. SynConst（定数）の定義
   └─ 各種リテラル値を表現する判別共用体
3. SynType（型）の定義
   └─ 型注釈、型適用、関数型等を表現する判別共用体
4. SynExpr（式）の定義
   └─ let式、関数適用、match式等を表現する判別共用体
5. SynPat（パターン）の定義
   └─ ワイルドカード、名前付き、コンストラクタパターン等を表現
6. SynModuleDecl/SynMemberDefn（宣言）の定義
   └─ モジュール、型、メンバーの宣言を表現
```

### フローチャート

```mermaid
flowchart TD
    A[ソースコード] --> B[レキサー]
    B --> C[パーサー]
    C --> D[構文木構築]
    D --> E{構文木ノード種別}
    E -->|式| F[SynExpr]
    E -->|型| G[SynType]
    E -->|パターン| H[SynPat]
    E -->|宣言| I[SynModuleDecl]
    F --> J[型チェッカーへ]
    G --> J
    H --> J
    I --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-91-1 | 位置情報必須 | すべての構文木ノードは位置情報（range）を保持する | 常時 |
| BR-91-2 | 不変性 | 構文木ノードは作成後に変更されない | 常時 |
| BR-91-3 | Trivia保持 | コメント、空白等のTrivia情報も保持可能 | IDE連携時 |

### 計算ロジック

該当なし

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

該当なし（メモリ内データ構造）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ParseError | 構文解析エラー | エラー回復を行い部分的な構文木を生成 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

大規模ソースファイル（数万行）でも数秒以内にパース完了すること

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

該当なし

## 備考

F# 8.0以降、SyntaxTrivia機構が強化され、フォーマッタやリファクタリングツールでの利用が容易になった。

---

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

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

### 推奨読解順序

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

まず、構文木の基本的な型定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SyntaxTree.fs | `src/Compiler/SyntaxTree/SyntaxTree.fs` | 構文木の全型定義（Ident, SynConst, SynType, SynExpr等） |
| 1-2 | SyntaxTrivia.fs | `src/Compiler/SyntaxTree/SyntaxTrivia.fs` | Trivia（コメント、空白）の型定義 |

**読解のコツ**: F#の判別共用体（Discriminated Union）を理解していることが前提。各ケースは構文の一種類を表す。

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

パーサーから構文木がどのように生成されるかを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | pars.fsy | `src/Compiler/pars.fsy` | パーサー定義、構文木ノードの生成箇所 |

**主要処理フロー**:
1. **14-25行目**: Ident構造体の定義 - idTextとidRangeを保持
2. **138-189行目**: SynConst判別共用体 - 各種リテラル値のケース
3. **439-496行目**: SynType判別共用体 - 型表現のケース

#### Step 3: 構文木操作を理解する

構文木を操作するユーティリティ関数を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SyntaxTreeOps.fs | `src/Compiler/SyntaxTree/SyntaxTreeOps.fs` | 構文木操作のヘルパー関数群 |

**主要処理フロー**:
- **19-27行目**: SynArgNameGenerator - 暗黙の引数名生成
- **29-45行目**: 識別子操作関数（ident, textOfId, rangeOfLid等）

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

```
pars.fsy (パーサー)
    │
    ├─ SyntaxTree.fs (型定義)
    │      ├─ Ident
    │      ├─ SynConst
    │      ├─ SynType
    │      ├─ SynExpr
    │      ├─ SynPat
    │      └─ SynModuleDecl
    │
    └─ SyntaxTreeOps.fs (操作関数)
           ├─ mkSynId
           ├─ mkSynApp
           └─ SimplePatOfPat
```

### データフロー図

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

ソースコード ───▶ レキサー ───▶ トークン列 ───▶ パーサー ───▶ 構文木(ParsedInput)
                                                              │
                                                              ├─ SynModuleOrNamespace
                                                              │      └─ SynModuleDecl list
                                                              │
                                                              └─ 型チェッカーへ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SyntaxTree.fs | `src/Compiler/SyntaxTree/SyntaxTree.fs` | ソース | 構文木の型定義 |
| SyntaxTree.fsi | `src/Compiler/SyntaxTree/SyntaxTree.fsi` | ソース | 公開シグネチャ |
| SyntaxTreeOps.fs | `src/Compiler/SyntaxTree/SyntaxTreeOps.fs` | ソース | 構文木操作関数 |
| SyntaxTrivia.fs | `src/Compiler/SyntaxTree/SyntaxTrivia.fs` | ソース | Trivia型定義 |
| pars.fsy | `src/Compiler/pars.fsy` | ソース | パーサー定義 |
| lex.fsl | `src/Compiler/lex.fsl` | ソース | レキサー定義 |
