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