2013-08-05 16 views
8

Wenn Sie entweder einen Lexer.x oder einen Parser.y Parser erstellen, der den Alex Lexer Generator oder den Happy Parser Generator verwendet, diese in Haskell Dateien kompiliert und diese in Objektdateien kompiliert, erzeugt dies standardmäßig den folgende „Warnungen“:Bestimmte Haskell Alex/Happy Kompilierungsnachrichten unterdrücken

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

diese Linien als Ergebnis der folgenden Zeilen auftreten in den generierten .hs Dateien eingebettet:

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

Warum sind diese Linien umfassen d, und gibt es eine Möglichkeit, diese Nachrichten zu unterdrücken, falls die Befehlszeile scheinbar für nichts im generierten Lexer und Parser verwendet wird?

Antwort

1

Googeln "links, aber nicht eingegeben" schlägt vor, dass Meldungen wie diese einen falsch konfigurierten gcc anzeigen. Hier ist der Code in Apple-Version, die die Nachricht generiert:

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

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

hier "ICE" bezieht sich auf "interner Compiler-Fehler".

Die Direktiven #LINE werden eingefügt, damit ghc Fehler basierend auf den Positionen in den .x- oder .y-Dateien melden kann. Es besagt, dass die folgende Zeile wirklich eine bestimmte Zeile aus einer anderen Datei ist. Die #line Richtlinien für die Pseudo-Dateinamen <command-line> und <built-in> können, weil sie immer sofort durch eine #line Richtlinie für einen echten Dateinamen gefolgt ignoriert werden, zB:

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

Als Test Sie einfach die # entfernen LINE Direktiven für <command-line> und sehen, ob die Warnungen weggehen. Ich würde auch versuchen, dein gcc und/oder deine Haskell-Plattform neu zu installieren/upgraden.