module Lexing:sig
..end
由 ocamllex
產生的詞法分析器的執行時期函式庫。
type
position = {
|
pos_fname : |
|
pos_lnum : |
|
pos_bol : |
|
pos_cnum : |
}
類型為 position
的值描述了原始檔案中的一個點。pos_fname
是檔案名稱;pos_lnum
是行號;pos_bol
是行首的偏移量 (詞法緩衝區的開頭到行首的字元數);pos_cnum
是位置的偏移量 (詞法緩衝區的開頭到該位置的字元數)。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 將觸發重新填充。