2013-08-05 23 views
8

Khi tạo một trình phân tích cú pháp Lexer.x hoặc Parser.y bằng trình tạo lexer Alex hoặc trình tạo trình phân tích cú pháp hạnh phúc, biên dịch các tệp đó thành tệp Haskell và biên dịch chúng thành tệp đối tượng. sau "cảnh báo":Ngăn chặn một số thông điệp biên soạn 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) 

những dòng xảy ra như là kết quả của các dòng sau được nhúng trong tạo .hs file:

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

tại sao những dòng bao gồm d, và là có một cách để ngăn chặn những thông điệp trong trường hợp dòng lệnh không được sử dụng cho bất cứ điều gì trong lexer tạo ra và phân tích cú pháp?

Trả lời

1

Googling "trái nhưng không được nhập" cho thấy rằng các thông báo như thế này cho biết cấu hình sai gcc. Đây là đoạn mã trong phiên bản của Apple nhằm tạo thư:

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

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

đây "ICE" đề cập đến "nội bộ lỗi biên dịch".

Chỉ thị #LINE được chèn để ghc có thể báo cáo lỗi dựa trên vị trí trong tệp .x hoặc .y. Nó nói rằng dòng sau thực sự là một dòng nhất định từ một tệp khác. Các chỉ thị #line cho tên tập tin giả <command-line><built-in> thể bỏ qua vì họ luôn ngay sau đó là một chỉ thị #line cho một tên tập tin thực tế, ví dụ:

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

Là một thử nghiệm bạn chỉ có thể loại bỏ cáC# Chỉ thị LINE cho <command-line> và xem cảnh báo có biến mất hay không. Tôi cũng sẽ thử cài đặt lại/nâng cấp gcc và/hoặc Nền tảng Haskell của bạn.

Các vấn đề liên quan