Подавить определенные сообщения компиляции Haskell Alex/Happy

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

$ 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>" #-}

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


person Simon Shine    schedule 05.08.2013    source источник


Ответы (1)


Поиск в Google «оставленный, но не вошедший» предполагает, что подобные сообщения указывают на неправильную настройку 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.

person ErikR    schedule 12.07.2014