---
# System prepended metadata

title: Menhir でモジュールの別名を定義して使う
tags: [public-tech]

---

---
breaks: false
tags: public-tech
---

# Menhir でモジュールの別名を定義して使う

この記事は [OCaml Tips Advent Calendar 2022](https://adventar.org/calendars/8396) の7日目です。

OCaml では、モジュール名が長い場合などに別名を定義して使うことができます。

```ocaml=
module V = VeeeeeeryLooooongModuleNaaaaaameeeeee
V.f ()
```

Menhir を使って字句解析器を定義する際にもこの機能を使いたくなります。
しかし、ナイーブに次のように書くとうまく動きません。

```ocaml=
%{ (* %{ ... %} 内には任意の OCaml コードを書くことができる *)
  module V = VeeeeeeryLooooongModuleNaaaaaameeeeee
%}

(* ... *)
%%

Expr:
  | ... { V.Expr (...) (* この V は正しくハンドルされない *) }
```

これは、OCaml が推論する型に別名である `V` が含まれてしまい、
それを参照する Menhir が `V` が別名であるとわからず
誤ったコードを生成してしまうためです。

この問題を回避するには、匿名構造体内（ anonymous structure ）で別名を定義して、それを `open` します。
なお、このワークアラウンドを使用するためには OCaml 4.08 以上が必要です。

```ocaml=
%{
  open struct module V = VeeeeeeryLooooongModuleNaaaaaameeeeee end
%}
```

なおこの解決方法は [Menhir Reference Manual (version 20220210)](https://gallium.inria.fr/~fpottier/menhir/manual.html) の 4.1.1 節に
記載されています。

## 参考

- [Menhir Reference Manual (version 20220210)](https://gallium.inria.fr/~fpottier/menhir/manual.html) の 4.1.1 節
