Menhir:--external-tokens 似乎找不到 Tokens 模块
Menhir: --external-tokens can't seem to find Tokens module
我有一个 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 的期望。
正如评论中所讨论的,出现错误是因为您没有
%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保持一致)
我有一个 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 的期望。
正如评论中所讨论的,出现错误是因为您没有
%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保持一致)