コード内の型を読み込み/出力するために、レクサー/パーサー/プリティプリンターの通常の組み合わせを実装しました。通常、記号、句読点、またはセパレーターに使用されるプレーン文字列の正規表現に関しては、レクサーとプリティプリンターの間に冗長性があることがわかりました。
たとえば、私は今持っています
rule token = parse
| "|-" { TURNSTILE }
私のlexer.mllファイルで、次のような関数:
let pp fmt (l,r) =
Format.fprintf fmt "@[%a |-@ %a@]" Form.pp l Form.pp r
きれいな印刷用。TURNSTILE の文字列を変更することにした場合、コード内の 2 つの場所を編集する必要がありますが、これは理想的とは言えません。
どうやら、OCaml lexer は、正規表現を定義し、ファイル内でmllそれらを参照する特定の機能をサポートしています。したがってlexer.mll、次のように書くことができます
let symb_turnstile = "|-"
rule token = parse
| symb_turnstile { TURNSTILE }
しかし、これでは外部からアクセスすることはできませんsymb_turnstile。たとえば、きれいな印刷機能からです。実際、 を実行した後、 inocamllexは発生しません。の OCaml エピローグでこれらの識別子を参照することさえできません。symb_turnstilelexer.mllexer.mll
これを達成する方法はありますか?