module Lexing: Lexing
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
。该函数应该从索引 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_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 的下一次使用将触发重新填充。