flex lexer अपरिभाषित संदर्भ yywrap करने के लिए




flex-lexer (4)

मेरे पास एक साधारण "भाषा" है कि मैं फ्लेक्स (लेक्सिकल विश्लेषक) का उपयोग कर रहा हूं, यह इस तरह है:

/* 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 करने की कोशिश करता cc lex.yy.c मुझे यह त्रुटियां cc lex.yy.c :

ubuntu @ eeepc: ~ / डेस्कटॉप $ सीसी lex.yy.c
/tmp/ccwwkhvq.o: फ़ंक्शन yylex': lex.yy.c:(.text+0x402): undefined reference to '
/tmp/ccwwkhvq.o: फ़ंक्शन input': lex.yy.c:(.text+0xe25): undefined reference to '
collect2: ld 1 निकास स्थिति लौटा दी

गलत क्या है?


फ्लेक्स हमेशा अपने विकास पुस्तकालयों के साथ स्थापित नहीं होता है (जो अजीब है, क्योंकि यह एक विकास उपकरण है)। पुस्तकालय स्थापित करें, और जीवन बेहतर है:

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

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

%option noyywrap

यद्यपि yywrap को अक्षम करना निश्चित रूप से सबसे अच्छा विकल्प है, लेकिन फ्लेक्स द्वारा प्रदान की गई लाइब्रेरी fl (यानी libfl.a ) में डिफ़ॉल्ट yywrap() फ़ंक्शन का उपयोग करने के लिए -lfl से लिंक करना भी संभव हो सकता है। पॉज़िक्स के लिए लाइब्रेरी को लिंकर फ्लैग -ll साथ उपलब्ध होना आवश्यक है और डिफ़ॉल्ट ओएस एक्स इंस्टॉल केवल उस नाम को प्रदान करता है।


मैं अपना खुद का 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.6.3 में एक बग है जहां libfl.a "आमतौर पर" yywrap को परिभाषित करता है लेकिन फिर कुछ मामलों में नहीं होता है, इसलिए जांचें कि यह आपका फ्लेक्स का संस्करण है, आपकी समस्या से संबंधित हो सकता है:

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