4 元编程
4.1 句法解析参考
-
Lean 内部解析器使用宏
leading_parser parser或trailing_parser parser进行句法解析,前者调用函数leadingNode从而创建节点node name parser,其中name : SyntaxNodeKind是节点类别- 当
parser为String元素时,存在Coe隐式转换为Parser元素的实现 - 称
Parser → Parser或返回Parser元素的函数为组合子,其在leading_parser宏中通常与其他Parser元素组合使用
- 当
4.1.1 解析器
-
CategoryParser:特定范畴的句法解析器 -
标识符解析器
ident与rawIdent:解析(可能带有命名空间的)标识符identWithPartialTrailingDot:无法解析成功;用于自动补全hygieneInfo:不解析字符,捕捉环境信息并创建匿名标识符;用于实现have := ...句法
- 字面值解析器
numLit:解析二进制、八进制、十六进制或十进制的整数字面值scientificLit:解析科学计数法记号的浮点数字面值strLit:解析字符串字面值,可以包含 C 风格转义字符charLit:解析单个 Unicode 码点的字符字面值,可以包含 C 风格转义字符nameLit:解析以单个反引号开头的名称字面值
- 位置解析器:规范代码缩进深度
colEq:要求下一词元的位置严格等于保存位置colGe:要求下一词元的位置大于等于保存位置colGt:要求下一词元的位置严格大于保存位置lineEq:要求当前词元的行位置与保存位置相同
-
Pretty Printer:不读入字符,仅提出对 Pretty Printer 输出的建议
4.1.2 组合子
- 基础组合子
andthen(p, q):先后依次解析p与q,是类型类AndThen的实现,因此也可使用其异构记号p >> qorelse(p, q):当且仅当解析p失败时解析q,是类型类OrElse的实现,因此也可使用其异构记号p <|> qrecover(p, h):用h恢复p中产生的错误,直到得出正确状态,与<|>的区别较微妙atomic(p):解析p,且失败时不会读入额外字符.这一特性适用于p <|> q,因其在p解析失败时不会回溯
- 重复与成组
optional(p):解析p,失败时返回空值;也可写作(p)?many(p):重复解析p直到失败,当元数大于一时自动将p替换为group(p);也可写作(p)*many1(p):类似于many(p),必须至少成功一次group(p):解析p,将结果封装在一个类别为groupKind的节点
- 位置与缩进
withPosition(p):解析p,记录并保存当前位置withoutPosition(p):解析p,并暂时忽略已保存位置withForbidden(tk, p):解析p,不允许出现词元tkwithoutForbidden(p):解析p,忽略不允许出现的词元(如有)manyIndent(p):相当于withPosition((colGe p)*)many1Indent(p):类似于manyIndent(p),相当于withPosition((colGe p)+)
- 分隔符相关
sepBy(p, s : String):重复解析由s分隔的psepBy1(p, s : String):类似于sepBy(p, s),必须至少成功一次sepByIndent(p, s : String):重复解析由s分隔的p.当后续p换行且缩进不小于第一个p,则分隔符s可选sepBy1Indent(p, s : String):类似于sepByIndent(p, s),必须至少成功一次sepByIndentSemicolon(p):相当于sepByIndent(p, "; ")sepBy1IndentSemicolon(p):类似于sepByIndentSemicolon(p),相当于sepBy1Indent(p, "; ")
- 反引用相关
mkAntiquot(n : String, k : SyntaxNodeKind):解析形如$e或$e:n的反引用mkAntiquot调用leadingNode创建类别为k ++ `antiquot的节点,该节点表示一个类别或范畴为n的句法元素- 可用
$$转义`()中的反引用,例如#check `(def var $$x:declVal)
withAntiquot(q, p):q通常为mkAntiquot ...,因此相当于mkAntiquot ... <|> p
- 其他组合子
lookahead(p):解析p但不构建节点,且成功时回溯到原位;相当于在不读入下一词元的条件下对下文进行断言notFollowedBy(p, info : String):当且仅当解析p失败时继续,否则返回消息info
4.2 系统级单子
4.2.1 环境相关
-
CoreM: 操作 Lean 环境的单子 -
MetaM:构建和操作元变量表达式 -
MacroM:处理卫生名称生成所需的信息
4.2.2 繁饰相关
-
CommandElabM:指令繁饰 -
TermElabM:项繁饰 -
TacticM:目标繁饰 -
LevelElabM:层级繁饰