我已經實現了用於在我的代碼中讀入/打印類型的詞法分析器/分析器/漂亮打印機的常用組合。當涉及到普通字符串正則表達式時,我發現在詞法分析器和漂亮打印機之間存在冗餘,通常用於符號,標點符號或分隔符。ocamllex正則表達式的外部定義
比如我現在有
rule token = parse
| "|-" { TURNSTILE }
在我lexer.mll
文件,並像一個函數:
let pp fmt (l,r) =
Format.fprintf fmt "@[%a |[email protected] %[email protected]]" Form.pp l Form.pp r
爲漂亮的印刷。如果我決定改變TURNSTILE的字符串,我必須在代碼中編輯兩個地方,我覺得這不太理想。
顯然,OCaml詞法分析器支持某種定義正則表達式的能力,然後在mll
文件內引用它們。所以lexer.mll
可以寫成
let symb_turnstile = "|-"
rule token = parse
| symb_turnstile { TURNSTILE }
但這不會讓我從外部訪問,symb_turnstile
,從我的漂亮的打印功能說。事實上,運行ocamllex
後,也有lexer.ml
沒有symb_turnstile
出現次數。我甚至無法在lexer.mll
的OCaml後記中提及這些標識符。
是否有實現這一目標的方法嗎?