首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Menhir:--外部令牌似乎找不到令牌模块

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

Stack Overflow用户
提问于 2019-07-03 05:57:59
回答 1查看 122关注 0票数 0

我有一个包含type token语句的tokens.ml文件。我还有一个带有相同type token语句的tokens.mli。现在,我有了一个使用来自tokens.mly的令牌的parser.mly。我想把我的令牌放在tokens.ml/mli里,把解析器放在parser.mly里。

因此,我尝试使用以下命令编译我的解析器

代码语言:javascript
复制
menhir parser.mly --table --explain --external-tokens Tokens

这会给我一个错误,说我的一个令牌不存在。具体来说,

代码语言:javascript
复制
File "parser.mly", line 173, characters 4-12:
Error: OPERATOR is undefined.

所以,门希尔没有找到Tokens模块。我不知道如何让menhir看到它。我尝试创建一个tokens.cma库,但即使这样,我仍然得到相同的错误。

Menhir似乎并不关心模块是否不存在,因为如果我运行以下命令

代码语言:javascript
复制
menhir parser.mly --table --explain --external-tokens SomeNonExistentModule

它仍然给出关于OPERATOR未定义的相同错误。

我如何让门希尔找到我的令牌模块。我不喜欢使用ocamlbuild。如果你建议一个ocamlbuild解决方案,请至少解释一下我可以做的中间手册步骤。我想知道门希尔期望的是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-03 19:01:08

正如注释中所讨论的,出现错误是因为您没有

代码语言:javascript
复制
%token OPERATOR

在您的.mly文件中声明。

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

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

tokens.mly:

代码语言:javascript
复制
%token <int> INT
%token EOF
%%

parser.mly:

代码语言:javascript
复制
%start <int> f
%%

f : n = INT; EOF { n }

然后,您可以运行以下命令:

代码语言:javascript
复制
menhir tokens.mly --only-tokens
menhir parser.mly tokens.mly --external-tokens Tokens --base parser

如果您想跨解析器等重用令牌,这将非常有用。

(您也可以跳过--only-tokens位,手动编写tokens.ml,以与tokens.mly保持一致)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56860514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档