Menhir: --外部令牌似乎找不到令牌模块



i有一个tokens.ml文件,其中包含type token语句。我也有一个具有相同type token语句的tokens.mli。现在,我有一个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的期望。

如评论中所讨论的,出现错误,因为您没有

%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位并手工编写令牌。

最新更新