1

我正在使用 Alex 3.0.5、Happy 1.18.10、Cabal 1.16.0.2

我有一个使用 Cabal 构建的小型编译器项目。我将编译器的内部作为库公开,所以我在公开的模块部分有 MyLangLex 和 MyLangPar。如果我删除 Alex 和 Happy 生成的 .hs 文件,然后运行 ​​cabal configure,然后 cabal build 将首先运行 Alex 和 Happy,生成文件,然后继续构建,一切正常。但是,如果我不删除这些文件,Alex 和 Happy 要么不构建文件,要么没有将它们放在正确的位置。我觉得Happy跑了,因为我看到了Happy发来的信息;但是,当我查看应该生成的 .hs 文件时,它是不正确的(其中没有变化),我可以确定 .hs 文件的版本。Cabal 在构建中使用的 hs 文件是错误的,因为应该改变的行为没有。即对 .y 文件的更改没有合并到构建的程序中,所以我怀疑在运行 Happy 时,Cabal 将此文件放在某个临时目录中,然后使用旧的 .hs 文件,该文件仍然存在建造。但我不确定这一点。

是我的错误还是其中一种工具行为不端?

4

1 回答 1

1

听起来您需要在 Lex.x 和 Par.y 的库部分中添加“其他模块:”指令:

library
  ...
  build-tools: alex, happy
  other-modules: Compiler.RSL.Syntax.Lex, Compiler.RSL.Syntax.Par

如果 .x 文件不存在,该other-modules指令build-tools将指示 cabal 使用和创建 Compiler/RSL/Syntax/Lex.hs(Par.hs 也是如此)。alex

或者,将 Compiler.RSL.Syntax.Lex 添加到您的“暴露模块”列表中。这告诉 cabal Lex.hs 文件应该存在,因此如果它不存在,cabal 将寻找使用 build-tools 行中的工具构建它的方法。

于 2014-07-14T19:14:18.540 回答