CST 特性
与 AST(抽象语法树)不同,CST(具体语法树)保留以下信息:
1. 注释保留
所有注释都保留在 CST 中,包括:
- 单行注释(
//) - 文档注释(
///) - 模块注释(
//!)
注释存储在对应节点的 comments 字段中。
2. 位置信息
每个节点包含精确的位置范围:
pub struct Span {
pub start: Position,
pub end: Position,
}
pub struct Position {
pub line: usize,
pub column: usize,
pub offset: usize,
}
位置信息用于:
- 错误报告
- 源代码映射
- 调试信息
- LSP 支持
3. 语法结构
保留完整的语法结构,包括所有标点符号:
- 括号:
(),{},[] - 标点:
:,,,; - 运算符:
+,-,*,/, etc.
这使得 CST 可以精确重建源代码。
4. 源代码重建
可以从 CST 精确重建源代码,包括:
- 所有语法结构
- 所有注释
- 原始格式(通过位置信息)
LSP 功能支持
CST 特性为以下 LSP 功能提供了更好的支持:
悬停提示
从 CST 节点的 comments 字段提取文档注释,显示在悬停提示中。
代码补全
利用 CST 的完整结构信息提供智能代码补全。
跳转定义
利用 CST 的位置信息实现精确的跳转定义功能。
错误报告
利用 CST 的位置信息提供准确的错误位置和上下文。
CST vs AST
| 特性 | CST | AST |
|---|---|---|
| 注释 | 保留 | 丢弃 |
| 位置信息 | 精确 | 可能不完整 |
| 语法结构 | 完整 | 抽象 |
| 源代码重建 | 可行 | 困难 |
| 适用场景 | LSP、格式化 | 编译、优化 |