2009-11-28 132 views
69

我有一個簡單的「語言」,我使用的Flex(詞法分析器),它是這樣的:未定義的引用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); 
} 

在我運行一個flex count.l,都沒有錯誤或警告變爲正常,然後當我嘗試做一個cc lex.yy.c我得到這個錯誤:

Ubuntu的@ EeePC的:〜/桌面$ CC的lex.yy.c
/tmp/ccwwkhvq.o:在功能yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap」
/TMP/ccwwkhvq.o:在功能input': lex.yy.c:(.text+0xe25): undefined reference to yywrap」
collect2:LD返回1退出狀態

有什麼不對?

回答

112

掃描儀在文件結尾處調用此函數,以便您可以將其指向另一個文件並繼續掃描其內容。如果你不需要這些,使用

%option noyywrap 

或鏈接與-lfl使用默認的yywrap()函數庫fl(即libfl.a),其Flex提供。

+0

非常感謝! – 2009-11-28 00:47:23

+0

非常感謝這 – JonnyRo 2013-03-29 18:44:44

+0

簡單,簡短,並重點。很有幫助。 – 2014-04-29 19:16:47

8

我更喜歡定義我自己的yywrap()。我正在用C++編譯,但重點應該是顯而易見的。如果有人用多個源文件調用編譯器,我將它們存儲在一個列表或數組中,然後在每個文件的末尾調用yywrap(),以便讓您有機會繼續使用新文件。

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

柔性並不總是與它的開發庫安裝(這是奇怪的,因爲它是一個開發工具)。安裝庫和生活好了:

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