2013-08-05 3 views
8

Podczas tworzenia parsera Lexer.x lub Parser.y przy użyciu generatora Alex lexer lub generatora parsera Happy, kompilując je do plików Haskella i kompilując je do plików obiektowych, domyślnie wygeneruje to następujące „ostrzeżenia”:Tłumienie pewnych wiadomości Haskella Alex/Happy compilation

$ 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) 

linie te występują w wyniku następujących liniach osadzonych w generowanych plikach: .hs

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

Dlaczego są te linie obejmują d, czy istnieje sposób na ich powstrzymanie w przypadku, gdyby linia poleceń nie była najwyraźniej używana do niczego w wygenerowanym lexerze i analizatorze składni?

Odpowiedz

1

Googling "w lewo, ale nie wpisano" sugeruje, że takie komunikaty wskazują błędnie skonfigurowany gcc. Oto kod w wersji Apple, który generuje komunikat:

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); 
} 

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

Here "ICE" odnosi się do "internal error kompilator".

Dyrektywy #LINE są wstawiane, aby ghc mógł zgłaszać błędy na podstawie lokalizacji w plikach .x lub .y. Mówi, że następujący wiersz jest rzeczywiście pewną linią z innego pliku. Dyrektywy #line dla nazw plików pseudo <command-line> i <built-in> mogą być ignorowane, ponieważ są one zawsze natychmiast następuje dyrektywy #line do prawdziwej nazwy pliku, np:

... 
{-# 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" #-} 
... 

Jako test można po prostu usunąć # LINE dyrektywy dla <command-line> i zobacz, czy ostrzeżenia znikną. Chciałbym również spróbować ponownie zainstalować/uaktualnić twój gcc i/lub twoją platformę Haskell.

Powiązane problemy