Tham chiếu không xác định tới yywrap


81

Tôi có một "ngôn ngữ" đơn giản mà tôi đang sử dụng Flex (Lexical Analyzer), nó như sau:

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

Tôi chạy a flex count.l, tất cả đều ổn mà không có lỗi hoặc cảnh báo, sau đó khi tôi cố gắng thực hiện một, cc lex.yy.ctôi gặp lỗi này:

ubuntu @ eeepc: ~ / Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: Trong hàm yylex': lex.yy.c:(.text+0x402): undefined reference toyywrap '
/tmp/ccwwkhvq.o: Trong hàm input': lex.yy.c:(.text+0xe25): undefined reference toyywrap'
collect2: ld trả về 1 trạng thái thoát

Chuyện gì thế?

Câu trả lời:


126

Máy quét gọi chức năng này khi kết thúc tệp, vì vậy bạn có thể trỏ nó đến một 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 cái này, hãy sử dụng

%option noyywrap

trong thông số kỹ thuật máy quét.

Mặc dù vô hiệu hóa yywrap chắc chắn là lựa chọn tốt nhất, nhưng cũng có thể liên kết với -lflđể sử dụng yywrap()chức năng mặc định trong thư viện fl(tức là libfl.a) do flex cung cấp. Posix yêu cầu thư viện đó phải có sẵn với cờ trình liên kết -llvà cài đặt OS X mặc định chỉ cung cấp tên đó.


1
Xin vui lòng thêm "% option noyywrap" vào đâu? Trong phần định nghĩa hay trên dòng lệnh?
yamex5

Tôi đã thêm nó vào đầu .ltệp và lexchấp nhận nó! Tôi không chắc đó có phải là nơi tốt nhất hay không. Có lẽ nó không quan trọng.
Deepak

9

Tôi muốn xác định yywrap () của riêng mình. Tôi đang biên dịch với C ++, nhưng vấn đề phải rõ ràng. Nếu ai đó gọi trình biên dịch có nhiều tệp nguồn, tôi lưu trữ chúng trong một danh sách hoặc mảng, 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;
}

3

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

Trên hệ thống cơ sở Redhat:

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

Trên hệ thống dựa trên Debian

sudo apt-get install libfl-dev

2

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

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


-1
int yywrap(){return(1);}

sử dụng mã này ở cuối chương trình..Đơn giản

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.