1

假设我有以下目录:

.
├── dune-project
├── myproj.opam
└── src
    ├── dune
    ├── module1.ml
    ├── parser1
    │   └── file1.ml
    └── parser2
        └── file2.ml

由于我希望所有内容都在同一个库中,因此我有以下内容:

源/沙丘:

(include_subdirs  unqualified)

(library
 (name myproj)
 (modules module1 file1 file2)
  )

它编译得很好。

现在,问题是,我的 file1 和 file2 实际上是 mly 文件,所以我有这个:

.
├── dune-project
├── myproj.opam
└── src
    ├── dune
    ├── module1.ml
    ├── parser1
    │   └── parser1.mly
    └── parser2
        └── parser2.mly

如果我尝试编译(通过在沙丘文件中通过解析器(1|2)更改文件(1|2)),我会遇到以下错误:

❯ dune build
File "src/dune", line 5, characters 26-33:
5 |  (modules module1 parser1 parser2 )
                              ^^^^^^^
Error: Module Parser2 doesn't exist.

我编辑我的沙丘文件:

(include_subdirs  unqualified)

(menhir
 (modules parser1 parser2)
)

(library
 (name myproj)
 (modules module1 parser1 parser2 )
  )

现在有两个错误:

❯ dune build
File "src/dune", line 3, characters 0-36:
3 | (menhir
4 |  (modules parser1 parser2)
5 | )
Error: No rule found for src/parser1.mly
File "src/dune", line 3, characters 0-36:
3 | (menhir
4 |  (modules parser1 parser2)
5 | )
Error: No rule found for src/parser2.mly

好的,然后我在 parser(1|2) 目录中添加两个沙丘文件:

(menhir
 (modules parser(1|2))
)

[编辑] 看起来我错过了一些东西,但这实际上工作得很好

我现在有和以前一样的错误:

❯ dune build
File "src/dune", line 5, characters 26-33:
5 |  (modules module1 parser1 parser2 )
                              ^^^^^^^
Error: Module Parser2 doesn't exist.

我错过了什么可以取悦沙丘吗?(如果我有 .mll 文件,我也会遇到同样的问题)

4

1 回答 1

4

menhir节不适用于 subdirs。这是一个尚未修复的错误1 ​​。有几种解决方法,例如将沙丘文件添加到您拥有解析器的文件夹中(我自己没有检查)。但我建议将解析器拆分为单独的库或将它们移动到src文件夹中。前者是首选,尤其是从那时起您就不需要编写该modules节了。


1)截至 2022 年 1 月

于 2022-01-21T19:23:34.987 回答