2009-11-28 13 views
69

मैं एक साधारण 'भाषा' है कि मैं फ्लेक्स (शाब्दिक विश्लेषक) का उपयोग कर रहा है, यह इस तरह है:अपरिभाषित संदर्भ 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); 
} 

The I एक flex count.l, सभी त्रुटि या चेतावनी के बिना ठीक हो जाता है चलाने के लिए,

ubuntu @ eeePC:: ~/डेस्कटॉप $ सीसी lex.yy.c
/tmp/ccwwkhvq.o: समारोह yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap 'में
/तो मैं इस त्रुटियों मिला जब मैं एक cc lex.yy.c करने की कोशिश tmp/ccwwkhvq.o: समारोह input': lex.yy.c:(.text+0xe25): undefined reference to yywrap 'में
collect2: ld 1 से बाहर निकलें स्थिति

क्या गलत है लौटे?

उत्तर

112

स्कैनर इस फ़ंक्शन को फ़ाइल के अंत में कॉल करता है, ताकि आप इसे किसी अन्य फ़ाइल पर इंगित कर सकें और इसकी सामग्री स्कैन करना जारी रख सकें। आप इस की जरूरत नहीं है,

%option noyywrap 

या लिंक का उपयोग करें -lfl साथ पुस्तकालय fl (अर्थात libfl.a) कि फ्लेक्स प्रदान करता है में डिफ़ॉल्ट yywrap() फ़ंक्शन का उपयोग करें।

+0

धन्यवाद बहुत बहुत! –

+0

इस – JonnyRo

+0

सरल, लघु और बिंदु के लिए बहुत सराहना करते हैं। बहुत उपयोगी। –

8

मैं अपना खुद का yywrap() परिभाषित करना पसंद करता हूं। मैं सी ++ के साथ संकलित कर रहा हूं, लेकिन बिंदु स्पष्ट होना चाहिए। अगर कोई एकाधिक स्रोत फ़ाइलों के साथ कंपाइलर को कॉल करता है, तो मैं उन्हें एक सूची या सरणी में संग्रहीत करता हूं, और फिर प्रत्येक फ़ाइल के अंत में 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 
2

अनुयायियों के लिए एक नोट के रूप में, फ्लेक्स 2.6.3 एक बग जहां libfl.a "आम तौर पर होता है" yywrap को परिभाषित है, लेकिन उसके बाद कुछ मामलों में ऐसा नहीं करता है, तो जाँच कि अगर फ्लेक्स के अपने संस्करण है, आपकी समस्या से संबंधित हो सकती:

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

संबंधित मुद्दे