0

我有一个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 的期望。

4

1 回答 1

3

如评论中所述,出现错误是因为您没有

%token OPERATOR

在您的.mly文件中声明。

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

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

令牌.mly:

%token <int> INT
%token EOF
%%

解析器.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保持一致)

于 2019-07-03T11:01:07.697 回答