# 注释关联规则

> 

解析器在构建 CST 时，会自动收集注释并关联到对应的语法节点。

## 关联规则

### 文档注释（`///`）

关联到紧随其后的函数、变量等定义。

```dj
/// 问候函数
/// @param name - 用户名
/// @returns - 问候语
func greet(name: string) -> string {
    `hello ${name}`
}
```

在 CST 中，`///` 开头的注释会存储在 `FuncDef` 节点的 `comments` 字段中。

### 模块注释（`//!`）

关联到 Program 节点，表示整个模块的文档。

```dj
//! 用户模块
//! 
//! 提供用户相关的功能，包括认证、用户信息管理等
```

在 CST 中，`//!` 开头的注释会存储在 `Program` 节点的 `comments` 字段中。

### 单行注释（`//`）

关联到最近的语法节点。

```dj
let x = 1; // 初始化变量
```

在 CST 中，`//` 开头的注释会关联到 `LetStmt` 节点。

## 注释收集过程

<steps level="4">

#### **词法分析**：识别并保留所有注释 Token

#### **语法分析**：在构建 CST 时收集注释

#### **关联**：根据注释类型和位置关联到对应的节点

#### **存储**：将注释存储在节点的 `comments` 字段中

</steps>

## CST 中的注释字段

每个 CST 节点都有一个 `comments` 字段：

```rust
pub struct Node {
    pub comments: Vec<Comment>,
    // ... 其他字段
}
```

`Comment` 类型定义：

```rust
pub enum Comment {
    Line(String),
    Doc(String),
    Module(String),
}
```
