Menhir 解析器函子?

问题描述 投票:0回答:1

是否可以让 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 可以一步完成。

ocaml functor menhir
1个回答
0
投票

您可以通过向解析器添加

%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
函子内生成解析代码,您可以使用各种实现来调用该代码。

© www.soinside.com 2019 - 2024. All rights reserved.