Menhir:--external-tokens似乎找不到代币模块

时间:2019-07-02 21:57:58

标签: ocaml menhir

我有一个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解决方案,请至少说明我可以做的中间手动步骤。我想了解门希尔的期望。

1 个答案:

答案 0 :(得分:3)

如评论中所述,由于您没有

,因此会出现错误
%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保持一致)