# 機能設計書 92-構文木操作

## 概要

本ドキュメントは、F#コンパイラにおける構文木操作（SyntaxTreeOps）機能について記述する。構文木定義（SyntaxTree.fs）で定義された型に対する操作関数群を提供し、構文木の生成、変換、解析を支援する。

### 本機能の処理概要

**業務上の目的・背景**：構文木は複雑なネストした構造を持つため、直接操作するのは煩雑である。本機能は、構文木の生成や変換を容易にするためのユーティリティ関数群を提供し、パーサー、型チェッカー、コード生成器の各フェーズでの開発効率を向上させる。

**機能の利用シーン**：
- パーサーが構文木ノードを構築する際
- 型チェッカーが構文木を解析・変換する際
- IDE連携でコード補完やリファクタリングを行う際
- 言語サービスで構文情報を抽出する際

**主要な処理内容**：
1. 識別子生成関数（mkSynId, textOfId, rangeOfLid等）
2. 式生成関数（mkSynApp, mkSynUnit, mkSynPatVar等）
3. パターン操作関数（SimplePatOfPat, isSimplePattern等）
4. 属性操作関数（GetSynArgNameIdeas等）
5. 範囲操作関数（unionRanges, rangeOfBindingAndRhs等）

**関連システム・外部連携**：SyntaxTree.fsの型定義を利用し、pars.fsyのパーサーアクションや型チェッカーから呼び出される。

**権限による制御**：該当なし（コンパイラ内部機能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | IDE統合 | 参照画面 | コード補完、リファクタリング |

## 機能種別

ユーティリティライブラリ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| 構文木ノード | SynExpr / SynPat / SynType | Yes | 操作対象の構文木 | 有効な構文木であること |
| 識別子 | Ident / LongIdent | Yes | 識別子情報 | - |
| 範囲情報 | range | Yes | ソースコード上の位置 | - |

### 入力データソース

パーサー出力、型チェッカー中間データ

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 生成された構文木ノード | SynExpr / SynPat / SynType | 新規生成された構文木 |
| 抽出された情報 | string / range / Ident list | 構文木から抽出された情報 |

### 出力先

型チェッカー、コード生成器

## 処理フロー

### 処理シーケンス

```
1. 識別子操作
   ├─ mkSynId: 文字列と範囲から識別子を生成
   ├─ textOfId: 識別子からテキストを抽出
   └─ rangeOfLid: LongIdentから範囲を計算

2. 式生成
   ├─ mkSynApp: 関数適用式を生成
   ├─ mkSynUnit: unit値を生成
   └─ mkSynBindingRhs: バインディングの右辺を生成

3. パターン操作
   ├─ SimplePatOfPat: 複雑なパターンを単純パターンに変換
   ├─ isSimplePattern: パターンが単純かどうか判定
   └─ PatOfSimplePat: 単純パターンをパターンに変換

4. 暗黙引数名生成
   └─ SynArgNameGenerator: ラムダ式の暗黙引数名を生成
```

### フローチャート

```mermaid
flowchart TD
    A[パーサー/型チェッカー] --> B{操作種別}
    B -->|識別子生成| C[mkSynId]
    B -->|式生成| D[mkSynApp]
    B -->|パターン変換| E[SimplePatOfPat]
    B -->|範囲計算| F[unionRanges]
    C --> G[構文木ノード]
    D --> G
    E --> G
    F --> H[範囲情報]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-92-1 | 範囲保存 | 操作後も元の範囲情報を可能な限り保存 | 常時 |
| BR-92-2 | 暗黙引数命名 | 暗黙引数は_arg1, _arg2...の形式で命名 | ラムダ式での暗黙引数生成時 |
| BR-92-3 | 識別子正規化 | 識別子のバッククォート等を正規化 | 識別子テキスト抽出時 |

### 計算ロジック

**暗黙引数名生成**：
```fsharp
// SynArgNameGenerator
let baseName = "_arg"
let generatedName = baseName + string(counter)
// counter は 1 から開始し、呼び出しごとにインクリメント
```

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | InvalidOperationException | 不正な構文木に対する操作 | 呼び出し元での検証 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

構文木操作は頻繁に呼び出されるため、低オーバーヘッドであること

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

該当なし

## 備考

SyntaxTreeOps.fsの関数は純粋関数として設計されており、副作用がない。

---

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

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

### 推奨読解順序

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

操作対象の構文木型を理解することが前提。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SyntaxTree.fs | `src/Compiler/SyntaxTree/SyntaxTree.fs` | 操作対象の型定義（Ident, SynExpr, SynPat等） |

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

主要な操作関数群を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SyntaxTreeOps.fs | `src/Compiler/SyntaxTree/SyntaxTreeOps.fs` | 全操作関数の定義 |

**主要処理フロー**:
- **19-27行目**: SynArgNameGenerator - カウンターベースの引数名生成クラス
- **29-45行目**: 識別子操作関数群（ident, textOfId, rangeOfLid等）
- **47-62行目**: mkSynIdGet, mkSynIdGetWithAlt - 識別子からGet式を生成
- **101-145行目**: SimplePatOfPat - パターンの単純化変換

#### Step 3: 呼び出し元を理解する

操作関数がどこから使われるかを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | pars.fsy | `src/Compiler/pars.fsy` | パーサーからの呼び出し |
| 3-2 | CheckExpressions.fs | `src/Compiler/Checking/CheckExpressions.fs` | 型チェッカーからの呼び出し |

**読解のコツ**:
- F#のパイプライン演算子（|>）とアクティブパターンを理解していると読みやすい
- SimplePatOfPatのような変換関数は再帰的なパターンマッチで実装されている

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

```
pars.fsy / CheckExpressions.fs
    │
    └─ SyntaxTreeOps.fs
           │
           ├─ 識別子操作
           │      ├─ ident: string * range -> Ident
           │      ├─ textOfId: Ident -> string
           │      ├─ rangeOfLid: LongIdent -> range
           │      └─ mkSynIdGet: range -> string -> SynExpr
           │
           ├─ 式生成
           │      ├─ mkSynApp: SynExpr -> SynExpr -> SynExpr
           │      ├─ mkSynUnit: range -> SynExpr
           │      └─ mkSynBindingRhs: ... -> SynExpr
           │
           └─ パターン操作
                  ├─ SimplePatOfPat: SynPat -> SynSimplePat
                  ├─ isSimplePattern: SynPat -> bool
                  └─ PatOfSimplePat: SynSimplePat -> SynPat
```

### データフロー図

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

パーサーアクション ───▶ mkSynId / mkSynApp ───▶ 新規構文木ノード
                              │
                              ▼
構文木ノード ─────────▶ textOfId / rangeOfLid ───▶ 抽出情報
                              │
                              ▼
複雑なパターン ───────▶ SimplePatOfPat ─────────▶ 単純パターン
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SyntaxTreeOps.fs | `src/Compiler/SyntaxTree/SyntaxTreeOps.fs` | ソース | 構文木操作関数の実装 |
| SyntaxTreeOps.fsi | `src/Compiler/SyntaxTree/SyntaxTreeOps.fsi` | ソース | 公開シグネチャ |
| SyntaxTree.fs | `src/Compiler/SyntaxTree/SyntaxTree.fs` | ソース | 操作対象の型定義 |
| pars.fsy | `src/Compiler/pars.fsy` | ソース | 主要な呼び出し元（パーサー） |
| CheckExpressions.fs | `src/Compiler/Checking/CheckExpressions.fs` | ソース | 主要な呼び出し元（型チェッカー） |
