模組 Stdlib.Lexing

module Lexing: Lexing

位置

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 時,將觸發重新填充。