Я реализовал обычную комбинацию 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
в lexer.ml
не встречается symb_turnstile
. Я даже не могу ссылаться на эти идентификаторы в эпилоге OCaml lexer.mll
.
Есть ли способ добиться этого?