【问题标题】:Menhir: --external-tokens can't seem to find Tokens moduleMenhir:--external-tokens 似乎找不到 Tokens 模块
【发布时间】:2019-07-02 21:57:58
【问题描述】:

我有一个tokens.ml 文件,其中有一个type token 语句。我也有一个 tokens.mli 与相同的 type token 声明。现在,我有一个parser.mly,它使用来自tokens.mly 的令牌。我想将我的令牌保留在 tokens.ml/mli 中,并将我的解析器保留在 parser.mly 中。

所以,我尝试使用命令编译我的解析器

menhir parser.mly --table --explain --external-tokens Tokens

这给了我一个错误,说我的一个令牌不存在。具体来说,

File "parser.mly", line 173, characters 4-12:
Error: OPERATOR is undefined.

所以,menhir 没有找到 Tokens 模块。我不知道如何让它对menhir 可见。我尝试创建一个tokens.cma 库,但即便如此我仍然遇到同样的错误。

Menhir 似乎并不关心模块是否不存在,因为如果我运行命令

menhir parser.mly --table --explain --external-tokens SomeNonExistentModule

它仍然给出关于 OPERATOR 未定义的相同错误。

如何让 Menhir 找到我的令牌模块。我宁愿不使用 ocamlbuild。如果您建议使用 ocamlbuild 解决方案,请至少说明我可以执行的中间手动步骤。我想了解 Menhir 的期望。

【问题讨论】:

  • 在您的 parser.mly 文件中,您的顶部是否还有 %token OPERATOR 指令?
  • 我需要那个吗?我绝对没有那个
  • 我相信是这样...我的理解是 --external-tokens 指令仅存在以便生成的 parser.ml 和 .mli 文件不会定义令牌类型,而是会引用外部令牌模块。您仍然需要 %token ... 在 .mly 文件中
  • 无论如何,您都需要它来指定优先级/关联性,并且docs 暗示从语法规范自动生成 tokens.ml 文件,因此假设存在 %token 指令
  • 是的,但是文档还说令牌文件可以手工编写而不是自动生成。不过我会试试的,谢谢。

标签: ocaml menhir


【解决方案1】:

正如在 cmets 中所讨论的,错误的出现是因为您没有

%token OPERATOR

.mly 文件中的声明。

存在 Menhir 的 --external-tokens T 选项以使生成的解析器模块使用 T.token 而不是从声明中生成令牌类型,但是在 .mly 文件中仍然需要声明。

附带说明一下,您可以将令牌放在单独的 .mly 文件中(例如 tokens.mly),如下所示:

tokens.mly:

%token <int> INT
%token EOF
%%

parser.mly:

%start <int> f
%%

f : n = INT; EOF { n }

然后你可以运行以下命令:

menhir tokens.mly --only-tokens
menhir parser.mly tokens.mly --external-tokens Tokens --base parser

如果您想跨解析器等重用标记,这可能很有用。

(也可以跳过--only-tokens位,手动编写tokens.ml,与tokens.mly保持一致)

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2023-03-11
    • 2022-06-21
    • 2021-01-20
    相关资源
    最近更新 更多