コード内の型を読み込み/出力するために、レクサー/パーサー/プリティプリンターの通常の組み合わせを実装しました。通常、記号、句読点、またはセパレーターに使用されるプレーン文字列の正規表現に関しては、レクサーとプリティプリンターの間に冗長性があることがわかりました。
たとえば、私は今持っています
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_turnstile
lexer.ml
lexer.mll
これを達成する方法はありますか?