模块 Parse

module Parse: sig .. end

解析器入口点

警告:此模块不稳定,属于 compiler-libs 的一部分。


val implementation : Lexing.lexbuf -> Parsetree.structure
val interface : Lexing.lexbuf -> Parsetree.signature
val toplevel_phrase : Lexing.lexbuf -> Parsetree.toplevel_phrase
val use_file : Lexing.lexbuf -> Parsetree.toplevel_phrase list
val core_type : Lexing.lexbuf -> Parsetree.core_type
val expression : Lexing.lexbuf -> Parsetree.expression
val pattern : Lexing.lexbuf -> Parsetree.pattern
val module_type : Lexing.lexbuf -> Parsetree.module_type
val module_expr : Lexing.lexbuf -> Parsetree.module_expr

以下函数可用于安全地解析 Longident。

val longident : Lexing.lexbuf -> Longident.t

函数 longident 保证解析 OCaml 中使用的 Longident.t 的所有子类:值、构造函数、简单或扩展模块路径以及类型或模块类型。

但是,此函数接受编译器不接受的输入,因为它们组合了函子应用和中缀运算符。在有效的 OCaml 语法中,只有值级标识符可以以中缀运算符结尾 Foo.( + )。此外,在值级标识符中,模块路径 Foo 必须是简单的(M.N 而不是 F(X)):函子应用只能出现在类型级标识符中。因此,诸如 F(X).( + ) 之类的路径不是有效的 OCaml 标识符;但此函数接受它。

接下来的函数专门用于 Longident.t 的一个子类。

val val_ident : Lexing.lexbuf -> Longident.t

此函数解析语法上有效的数值路径。例如,xM.x(+.) 是有效的。相反,M.AF(X).xtrue 被拒绝。

OCaml 值的 Longident 不能包含函子应用。 Longident.t 的最后一个组件不以大写字母开头,但可以是运算符 A.Path.To.(.%.%.(;..)<-)

val constr_ident : Lexing.lexbuf -> Longident.t

此函数解析语法上有效的变体构造函数路径。例如,AM.AM.(::) 是有效的,但 M.aF(X).A 均被拒绝。

OCaml 变体构造函数的 Longident 不能包含函子应用。 Longident.t 的最后一个组件以大写字母开头,或者它可能是以下特殊构造函数之一:truefalse()[](::)。在这些特殊构造函数中,只有 (::) 可以以模块路径为前缀(A.B.C.(::))。

val simple_module_path : Lexing.lexbuf -> Longident.t

此函数解析语法上有效的模块路径。例如,AM.A 是有效的,但 M.aF(X).A 均被拒绝。

OCaml 模块的 Longident 不能包含函子应用。 Longident.t 的最后一个组件以大写字母开头。

val extended_module_path : Lexing.lexbuf -> Longident.t

此函数解析语法上有效的扩展模块路径。例如,A.BF(A).B 是有效的。相反,(.%())[] 均被拒绝。

Longident.t 的最后一个组件以大写字母开头。

val type_ident : Lexing.lexbuf -> Longident.t

此函数解析语法上有效的类型或模块类型路径。例如,AtM.tF(X).t 是有效的。相反,(.%())[] 均被拒绝。

在类型和模块类型的路径中,只拒绝运算符和特殊构造函数。