我正在使用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文件的版本是错误的,因为应该改变的行为不会。即对.y文件的更改没有合并到构建的程序中,所以我怀疑在运行Happy时,Cabal将此文件放在某个临时目录中,然后使用旧的.hs文件,该文件仍然存在。但我不确定这一点。
我是错误还是工具行为不端?
答案 0 :(得分:1)
听起来你的库部分需要一个针对Lex.x和Par.y的“other-modules:”指令:
library
...
build-tools: alex, happy
other-modules: Compiler.RSL.Syntax.Lex, Compiler.RSL.Syntax.Par
other-modules
指令和build-tools
将指示cabal使用alex
并从.x文件创建编译器/ RSL /语法/ Lex.hs(如果它不存在) (Par.hs也是如此)。
或者,将Compiler.RSL.Syntax.Lex添加到“exposed-modules”列表中。这告诉cabal Lex.hs文件应该存在,所以如果它没有cabal将寻找使用构建工具行中的工具构建它的方法。