2013-08-05 6 views
8

При создании парса Lexer.x или Parser.y с использованием генератора Alex lexer или генератора счастливого парсера, скомпилирования этих файлов в файлы Haskell и их компиляции в объектные файлы, по умолчанию это приведет к созданию следующие «предупреждения»:Подавить определенные сообщения Haskell Alex/Happy компиляции

$ ghc Lexer 
line-map.c: file "<command-line>" left but not entered 
line-map.c: file "<command-line>" left but not entered 
[1 of 1] Compiling Lexer   (Lexer.hs, Lexer.o) 
$ happy Parser.y 
$ ghc Parser 
line-map.c: file "<command-line>" left but not entered 
line-map.c: file "<command-line>" left but not entered 
[2 of 2] Compiling Parser   (Parser.hs, Parser.o) 

эти линии возникают в результате следующих линий, встроенных в сгенерированных .hs файлов:

{-# LINE 1 "<command-line>" #-} 

Почему эти линии включают в себя d, и есть ли способ подавить эти сообщения в случае, если строка командной строки, по-видимому, не используется ни для чего в сгенерированном лексере и синтаксическом анализаторе?

ответ

1

Googling «левый, но не введенный» предполагает, что подобные сообщения указывают на неправильную конфигурацию gcc. Вот код в версии Apple, который генерирует сообщение:

void 
linemap_check_files_exited (struct line_maps *set) 
{ 
    struct line_map *map; 
    /* Depending upon whether we are handling preprocessed input or 
    not, this can be a user error or an ICE. */ 
    for (map = &set->maps[set->used - 1]; ! MAIN_FILE_P (map); 
     map = INCLUDED_FROM (set, map)) 
    fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n", 
     map->to_file); 
} 

(от http://www.opensource.apple.com/source/gcc/gcc-5484/libcpp/line-map.c)

Здесь «ICE» относится к «внутренняя ошибка компилятора».

Директивы #LINE вставлены так, что ghc может сообщать об ошибках на основе местоположений в файлах .x или .y. В нем говорится, что следующая строка действительно является определенной строкой из другого файла. Директивы #line для имен файлов псевдо <command-line> и <built-in> могут быть проигнорированы, потому что они всегда сразу после директивы #line для реального имени файла, например:

... 
{-# LINE 1 "<built-in>" #-} 
{-# LINE 1 "<command-line>" #-} 
{-# LINE 1 "templates/wrappers.hs" #-} 
... 
{-# LINE 1 "<built-in>" #-} 
{-# LINE 1 "<command-line>" #-} 
{-# LINE 1 "templates/GenericTemplate.hs" #-} 
... 

В качестве теста можно просто удалить # LINE для <command-line> и проверьте, не исчезли ли предупреждения. Я также попробую переустановить/обновить вашу gcc и/или вашу платформу Haskell.