我使用的是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要么不构建这些文件,要么没有将它们放在正确的位置。我认为快乐运行,因为我看到了来自快乐的消息;然而,当我查看应该生成的.hs文件时,它是不正确的(没有更改),并且我可以肯定地说,Cabal在构建中使用的.hs文件的版本是错误的,因为应该更改的行为没有。也就是说,对.y文件的更改没有合并到构建的程序中,所以我怀疑在运行Happy时,Cabal会将该文件放在某个临时目录中,然后使用旧的.hs文件,该文件在构建过程中仍然存在。但这一点我不太确定。
是我出了错,还是某个工具表现不佳?
发布于 2014-07-15 03:14:19
听起来您需要在Lex.x和Par.y的库节中使用"other-modules:“指令:
library
...
build-tools: alex, happy
other-modules: Compiler.RSL.Syntax.Lex, Compiler.RSL.Syntax.Parother-modules指令和build-tools将指示cabal使用alex,如果不存在编译器/RSL/Syntax/lex.hs,则从.x文件创建编译器/RSL/Syntax/lex.hs(对于Par.hs也是如此)。
或者,将Compiler.RSL.Syntax.Lex添加到“exposed-modules”列表中。这会告诉cabal这个Lex.hs文件应该存在,所以如果它不存在,cabal将寻找使用build-tools行中的工具构建它的方法。
https://stackoverflow.com/questions/22597292
复制相似问题