2009-11-28 26 views
69

Tôi có một "ngôn ngữ" đơn giản mà tôi đang sử dụng Flex (từ vựng Analyzer), nó là như thế này:Reference Undefined Để yywrap

/* Just like UNIX wc */ 
%{ 
int chars = 0; 
int words = 0; 
int lines = 0; 
%} 

%% 
[a-zA-Z]+ { words++; chars += strlen(yytext); } 
\n  { chars++; lines++; } 
.   { chars++; } 
%% 

int main() 
{ 
    yylex(); 
    printf("%8d%8d%8d\n", lines, words, chars); 
} 

Các tôi chạy một flex count.l, mọi việc suôn sẻ ok mà không có lỗi hoặc cảnh báo, sau đó khi tôi cố gắng để làm một cc lex.yy.c tôi đã nhận lỗi này:

ubuntu @ eeepc: ~/Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: Trong chức năng yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap'
/tmp/ccwwkhvq.o: Trong chức năng input': lex.yy.c:(.text+0xe25): undefined reference to yywrap'
collect2: ld trở về tình trạng 1 lối

Điều gì là sai?

Trả lời

112

Máy quét gọi chức năng này ở cuối tệp, vì vậy bạn có thể trỏ nó đến tệp khác và tiếp tục quét nội dung của nó. Nếu bạn không cần điều này, sử dụng

%option noyywrap 

hoặc liên kết với -lfl để sử dụng mặc định yywrap() chức năng trong thư viện fl (ví dụ: libfl.a) flex cung cấp.

+0

Cảm ơn rất nhiều! –

+0

Rất nhiều đánh giá cao này – JonnyRo

+0

Đơn giản, ngắn gọn, và cho điểm. Rất hữu ích. –

8

Tôi thích xác định yywrap của riêng mình(). Tôi đang biên dịch với C++, nhưng điểm phải rõ ràng. Nếu ai đó gọi trình biên dịch với nhiều tệp nguồn, tôi lưu trữ chúng trong một danh sách hoặc mảng, và sau đó yywrap() được gọi ở cuối mỗi tệp để cho bạn cơ hội tiếp tục với một tệp mới.

int yywrap() { 
    // open next reference or source file and start scanning 
    if((yyin = compiler->getNextFile()) != NULL) { 
     line = 0; // reset line counter for next source file 
     return 0; 
    } 
    return 1; 
} 
2

flex không phải lúc nào cũng cài đặt với thư viện phát triển (kỳ lạ, vì nó là công cụ phát triển). Cài đặt thư viện, và cuộc sống là tốt hơn:

yum -y install flex-devel 
./configure && make 
2

Là một lưu ý cho tín đồ, 2.6.3 flex có một lỗi nơi libfl.a "thường sẽ" định nghĩa yywrap nhưng sau đó không trong những trường hợp nhất định, vì vậy kiểm tra nếu đó là phiên bản của bạn của flex, có thể liên quan đến vấn đề của bạn:

https://github.com/westes/flex/issues/154