【问题标题】:Alex, Happy, Cabal, and Re-preprocessingAlex、Happy、Cabal 和重新预处理
【发布时间】:2014-03-23 21:27:37
【问题描述】:

我正在使用 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 文件时,它是不正确的(其中没有更改),我可以确定 Cabal 在构建中使用的 .hs 文件的版本是错误的一个,因为应该改变的行为没有。 IE。对 .y 文件的更改不会合并到构建的程序中,所以我怀疑在运行 Happy 时,Cabal 将此文件放在某个临时目录中,然后使用旧的 .hs 文件,该文件仍然存在于构建中.但我不确定。

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

【问题讨论】:

  • 也许这个答案是相关的? Using alex/happy with Cabal 无论如何,看看你的阴谋集团文件会很有帮助。
  • 感谢您的评论。如果我删除 Lex.hs 和 Par.hs(这样我只有 Lex.x 和 Par.y),并且 cabal clean -> cabal configure -> cabal build - 构建失败。如果我在相应的文件上运行 alex 并高兴,则构建成功。此外,当我有一个平面目录时,构建曾经可以工作,但当我移动到分层结构时开始失败。词法分析器位于 src/Compiler/RSL/Syntax/Lex.x 中。 Lex.x 和 Par.y 中的模块头使用目录结构(例如,在 Lex.x 模块字段中,它是“module Compiler.RSL.Syntax.Lex where”)。我的阴谋集团文件是lpaste.net/107438
  • 你找到答案了吗?我也很震惊 Cabal 将生成的文件转储到我的目录中,而不是将其与其他生成的文件一起保存在某个隐藏文件夹中。

标签: haskell cabal happy alex


【解决方案1】:

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

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

other-modules 指令连同build-tools 将指示 cabal 使用 alex 并从 .x 文件创建 Compiler/RSL/Syntax/Lex.hs(如果它不存在)(对于 Par .hs)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2023-04-02
    • 2015-12-30
    • 2014-06-02
    • 2013-12-17
    • 2013-04-21
    相关资源
    最近更新 更多