模块 Lexing

module Lexing: sig .. end

ocamllex 生成的词法分析器的运行时库。


位置

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。该函数应将 n 个字节或更少的字节放入 s 中,从索引 0 开始,并返回提供的字节数。返回值为 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 的下一次使用将触发重新填充。