Алекс, Хэппи, Кабал и повторная предварительная обработка
Я использую Alex 3.0.5, Happy 1.18.10, Cabal 1.16.0.2
У меня есть небольшой проект компилятора, который построен с использованием Cabal. Я представляю внутреннюю часть компилятора как библиотеку, поэтому я имею в разделе "Открытые модули" MyLangLex и MyLangPar. Если я удаляю файлы.hs, сгенерированные Alex и Happy, то запускаю cabal configure, а затем сборка cabal сначала запускает Alex и Happy, генерирует файлы, а затем продолжает сборку, и все работает как положено. Однако, если я не удаляю эти файлы, Alex и Happy либо не создают файлы, либо не помещают их в нужное место. Я думаю, что Happy бежит, потому что я вижу сообщение от Happy; однако, когда я смотрю на файл.hs, который должен быть сгенерирован, он неверен (в нем нет изменений), и я могу точно сказать, что версия файла.hs, который Cabal использует в сборке, является неправильный, потому что поведение, которое должно было измениться, не меняется. Т.е. изменение файла.y не включается во встроенную программу, поэтому я подозреваю, что во время работы Happy Cabal помещает этот файл в какой-то временный каталог, а затем использует старый файл.hs, который все еще существует для строить. Но я не уверен в этом.
Ошибка с моей стороны или один из инструментов не работает?
1 ответ
Похоже, вам нужна директива "other-modules:" в разделе вашей библиотеки для Lex.x и Par.y:
library
...
build-tools: alex, happy
other-modules: Compiler.RSL.Syntax.Lex, Compiler.RSL.Syntax.Par
other-modules
директива вместе с build-tools
проинструктирует клику использовать alex
и создать Compiler/RSL/Syntax/Lex.hs из файла.x, если он не существует (и то же самое для Par.hs).
В качестве альтернативы, добавьте Compiler.RSL.Syntax.Lex в список "открытых модулей". Это говорит cabal, что файл Lex.hs должен существовать, и поэтому, если это не так, cabal будет искать способы его сборки, используя инструменты в строке build-tools.