module Lexing:sig
..end
由 ocamllex
生成的词法分析器的运行时库。
type
position = {
|
pos_fname : |
|
pos_lnum : |
|
pos_bol : |
|
pos_cnum : |
}
类型 position
的值描述源文件中的一个点。 pos_fname
是文件名; pos_lnum
是行号; pos_bol
是行首的偏移量(lexbuf 开始到行开始之间的字符数); pos_cnum
是位置的偏移量(lexbuf 开始到位置之间的字符数)。 pos_cnum
和 pos_bol
之间的差是行内的字符偏移量(即列号,假设每个字符占一列)。
有关词法分析引擎如何管理位置的信息,请参阅类型 lexbuf
的文档。
val dummy_pos : position
类型 position
的值,保证与任何有效位置不同。
type
lexbuf = {
|
refill_buff : |
|
mutable lex_buffer : |
|
mutable lex_buffer_len : |
|
mutable lex_abs_pos : |
|
mutable lex_start_pos : |
|
mutable lex_curr_pos : |
|
mutable lex_last_pos : |
|
mutable lex_last_action : |
|
mutable lex_eof_reached : |
|
mutable lex_mem : |
|
mutable lex_start_p : |
|
mutable lex_curr_p : |
}
词法分析缓冲区的类型。词法分析缓冲区是传递给由生成的扫描器定义的扫描函数的参数。词法分析缓冲区保存扫描器的当前状态,以及一个用于从输入中重新填充缓冲区的函数。
词法分析器可以选择维护 lex_curr_p
和 lex_start_p
位置字段。此“位置跟踪”模式是默认模式,它对应于将 ~with_position:true
传递给创建词法分析缓冲区的函数。在此模式下,词法分析引擎和词法分析动作共同负责正确更新位置字段,如下一段所述。当显式禁用此模式(使用 ~with_position:false
)时,词法分析引擎将不会触及位置字段,并且词法分析动作也应注意不要触及它们;然后,lex_curr_p
和 lex_start_p
字段将始终保存 dummy_pos
无效位置。不跟踪位置可以避免分配和内存写入,并且可以显着提高在不需要 lex_start_p
和 lex_curr_p
的上下文中词法分析器的性能。
位置跟踪模式的工作原理如下。在每个标记处,词法分析引擎会将 lex_curr_p
复制到 lex_start_p
,然后通过使用自 lexbuf
开始以来读取的字符数更新它来更改 lex_curr_p
的 pos_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_positions
为 false
时,词法分析动作不应修改位置字段。如果仍然这样做,可能会重新启用 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 的下一次使用将触发重新填充。