Lean 的语法树。
语法树在 Lean 中无处不在:解析器产生语法树,宏展开器变换语法树,精译器再精译 语法树。反精译器也会产生语法树,并把它们呈现给用户。
构造子
Lean.Syntax.missing : Lean.Syntax
因解析错误而缺失的一段语法。
对 Syntax 使用索引运算符时,若索引越界也会返回 Syntax.missing。
Lean.Syntax.node (info : Lean.SourceInfo) (kind : Lean.SyntaxNodeKind) (args : Array Lean.Syntax) : Lean.Syntax
语法树中可以含有更多子语法的节点;kind 决定节点的解释。
解析器产生的节点通常令 info 为 Lean.SourceInfo.none,源信息保存在相应标识符
和原子的字段中。该字段有两种用途:
-
反精译器用它把节点与实现交互功能所用的元数据关联起来。
-
引用创建的节点用该字段把语法标记为合成语法(存储
Lean.SourceInfo.fromRef的结果),即使其首尾记号本身不是合成的。
Lean.Syntax.atom (info : Lean.SourceInfo) (val : String) : Lean.Syntax
语法中不是标识符的原子组成部分。
以下各项都是原子:
-
关键字,如
def、fun和inductive -
字面量,如数字字面量或字符串字面量
-
标点和分隔符,如
(、)和=>。
标识符由 Lean.Syntax.ident 构造子表示。原子也对应 syntax 声明中的引号字符串。
Lean.Syntax.ident (info : Lean.SourceInfo) (rawVal : Substring.Raw) (val : Lean.Name) (preresolved : List Lean.Syntax.Preresolved) : Lean.Syntax
标识符。
除源信息外,标识符还具有以下字段:
-
rawVal是输入文件中的字面子串 -
val是解析后的 Lean 名称,可能包含宏作用域。 -
preresolved是它可能指向的声明列表,由引用填充。