模組 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 是行首的偏移量 (詞法緩衝區的開頭到行首的字元數);pos_cnum 是位置的偏移量 (詞法緩衝區的開頭到該位置的字元數)。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 將觸發重新填充。