【发布时间】: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 指令
-
是的,但是文档还说令牌文件可以手工编写而不是自动生成。不过我会试试的,谢谢。