是否可以让 Menhir 生成一个函子?或者有什么效果?
举一个小例子,假设您有一个语言家族,除了值类型和关键字之外,它们共享相同的结构。假设我有一个模块签名:
module type M = sig
type value_type
type keyword
end
一些 AST 函子:
module AST (M : M) = struct
type t = ...
...
end
我可以通过使用不同的
M
实例化它们来定义具有不同类型和关键字的多个 AST 变体。例如AST1 = AST(M1)
、AST2 = AST(M2)
等
如果我想要
AST(M).t
的解析器,但是,我只能为每个 AST1
、AST2
等制作不同的解析器,除非有办法使解析器在 M
上参数化。
我也可以定义一个交集 AST,然后将其转换为每个变体。但这需要在解析后遍历每个 AST,所以我希望 Menhir 可以一步完成。
您可以通过向解析器添加
%parameter
标头来定义参数化解析器:
%parameter<M:sig
type value
type keyword
end>
menhir 存储库有一个示例,位于 https://gitlab.inria.fr/fpottier/menhir/-/blob/master/demos/calc-param/parser.mly?ref_type=heads#L4。
使用此参数将在
Make
函子内生成解析代码,您可以使用各种实现来调用该代码。