模块 Stdlib.Lexing

module Lexing: Lexing

位置

type position = {
   pos_fname : string;
   pos_lnum : int;
   pos_bol : int;
   pos_cnum : int;
}

类型为 position 的值描述了源文件中的一个点。 pos_fname 是文件名;pos_lnum 是行号;pos_bol 是行首的偏移量(从 lexbuf 的开头到行首的字符数);pos_cnum 是位置的偏移量(从 lexbuf 的开头到位置的字符数)。pos_cnumpos_bol 之间的差值是行内的字符偏移量(即列号,假设每个字符占据一列)。

有关词法分析引擎如何管理位置的信息,请参见类型 lexbuf 的文档。

val dummy_pos : position

类型为 position 的值,保证与任何有效位置不同。

词法分析器缓冲区

type lexbuf = {
   refill_buff : lexbuf -> unit;
   mutable lex_buffer : bytes;
   mutable lex_buffer_len : int;
   mutable lex_abs_pos : int;
   mutable lex_start_pos : int;
   mutable lex_curr_pos : int;
   mutable lex_last_pos : int;
   mutable lex_last_action : int;
   mutable lex_eof_reached : bool;
   mutable lex_mem : int array;
   mutable lex_start_p : position;
   mutable lex_curr_p : position;
}

词法分析器缓冲区的类型。词法分析器缓冲区是传递给由生成的扫描器定义的扫描函数的参数。词法分析器缓冲区包含扫描器的当前状态,以及一个从输入中重新填充缓冲区的函数。

词法分析器可以选择性地维护 lex_curr_plex_start_p 位置字段。这种“位置跟踪”模式是默认模式,它对应于将 ~with_position:true 传递给创建词法分析器缓冲区的函数。在这种模式下,词法分析引擎和词法分析动作共同负责正确更新位置字段,如下一段所述。当显式禁用模式(使用 ~with_position:false)时,词法分析引擎不会触碰位置字段,词法分析动作也应该小心不要触碰它们;此时,lex_curr_plex_start_p 字段将始终保持无效位置 dummy_pos。不跟踪位置可以避免分配和内存写入,并且可以显著提高词法分析器在不需要 lex_start_plex_curr_p 的上下文中的性能。

位置跟踪模式的工作方式如下。在每个标记处,词法分析引擎会将 lex_curr_p 复制到 lex_start_p,然后通过使用自 lexbuf 开始以来的读取字符数更新 lex_curr_ppos_cnum 字段。词法分析引擎不会更改其他字段。为了保持它们的准确性,必须在第一次使用 lexbuf 之前初始化它们,并在相关的词法分析动作中更新它们(即在每行结束时 - 另请参见 new_line)。

val from_channel : ?with_positions:bool -> in_channel -> lexbuf

在给定的输入通道上创建一个词法分析器缓冲区。 Lexing.from_channel inchan 返回一个从输入通道 inchan 读取的词法分析器缓冲区,位于当前读取位置。

val from_string : ?with_positions:bool -> string -> lexbuf

创建一个从给定字符串读取的词法分析器缓冲区。从字符串中的第一个字符开始读取。当达到字符串末尾时,会生成一个输入结束条件。

val from_function : ?with_positions:bool -> (bytes -> int -> int) -> lexbuf

使用给定的函数作为其读取方法创建一个词法分析器缓冲区。当扫描器需要更多字符时,它会调用给定的函数,并向其传递一个字节序列 s 和一个字节计数 n。该函数应该从索引 0 开始将不超过 n 个字节放入 s 中,并返回提供的字节数。返回值 0 表示输入结束。

val set_position : lexbuf -> position -> unit

lexbuf 的初始跟踪输入位置设置为自定义值。忽略 pos_fname。有关更改此字段的信息,请参见 Lexing.set_filename

val set_filename : lexbuf -> string -> unit

lexbuf 中的初始跟踪位置中的文件名设置为 file

val with_positions : lexbuf -> bool

判断词法分析器缓冲区是否跟踪位置字段 lex_curr_p / lex_start_p,这由创建词法分析器缓冲区的相应可选参数决定(其默认值为 true)。

with_positionsfalse 时,词法分析动作不应修改位置字段。即使这样做也可能会重新启用 with_position 模式并降低性能。

词法分析器语义动作函数

以下函数可以在词法分析器定义的语义动作中调用(包含在花括号中的 ML 代码,用于计算词法分析函数返回的值)。它们可以访问与语义动作关联的正则表达式匹配的字符字符串。这些函数必须应用于参数 lexbuf,在由 ocamllex 生成的代码中,它绑定到传递给解析函数的词法分析器缓冲区。

val lexeme : lexbuf -> string

Lexing.lexeme lexbuf 返回由正则表达式匹配的字符串。

val lexeme_char : lexbuf -> int -> char

Lexing.lexeme_char lexbuf i 返回匹配字符串中的第 i 个字符。

val lexeme_start : lexbuf -> int

Lexing.lexeme_start lexbuf 返回匹配字符串的第一个字符在输入流中的偏移量。流的第一个字符的偏移量为 0。

val lexeme_end : lexbuf -> int

Lexing.lexeme_end lexbuf 返回匹配字符串的最后一个字符后面的字符在输入流中的偏移量。流的第一个字符的偏移量为 0。

val lexeme_start_p : lexbuf -> position

lexeme_start 相似,但返回一个完整的 position 而不是偏移量。当位置跟踪被禁用时,该函数返回 dummy_pos

val lexeme_end_p : lexbuf -> position

lexeme_end 相似,但返回一个完整的 position 而不是偏移量。当位置跟踪被禁用时,该函数返回 dummy_pos

val new_line : lexbuf -> unit

更新 lexbuf 的 lex_curr_p 字段以反映新行的开头。您可以在匹配换行符的规则的语义动作中调用此函数。当位置跟踪被禁用时,该函数不会执行任何操作。

其他函数

val flush_input : lexbuf -> unit

丢弃缓冲区的内容并将当前位置重置为 0。对 lexbuf 的下一次使用将触发重新填充。