我已经实现了 lexer/parser/pretty-printer 的常用组合,用于在我的代码中读入/打印类型。当涉及到通常用于符号、标点符号或分隔符的纯字符串正则表达式时,我发现词法分析器和漂亮打印机之间存在冗余。
例如我现在有
rule token = parse
| "|-" { TURNSTILE }
在我的lexer.mll
文件中,以及类似的功能:
let pp fmt (l,r) =
Format.fprintf fmt "@[%a |-@ %a@]" Form.pp l Form.pp r
用于漂亮的印刷。如果我决定更改 TURNSTILE 的字符串,我必须编辑代码中的两个地方,我觉得这不太理想。
显然,OCaml 词法分析器支持一定的能力来定义正则表达式,然后在mll
文件中引用它们。所以lexer.mll
可以写成
let symb_turnstile = "|-"
rule token = parse
| symb_turnstile { TURNSTILE }
但这不会让我symb_turnstile
从外部访问,比如我的漂亮打印功能。事实上,在运行之后ocamllex
,并没有出现symb_turnstile
in lexer.ml
。我什至无法在lexer.mll
.
有没有办法做到这一点?