अनिर्धारित संदर्भ yywrap के लिए


82

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

/* 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: ~ / Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: फंक्शन yylex': lex.yy.c:(.text+0x402): undefined reference toyywrap '
/tmp/ccwwkhvq.o: फंक्शन input': lex.yy.c:(.text+0xe25): undefined reference toyywrap में /
संग्रहण 2: ld ने 1 एग्जिट स्टेटस लौटाया

गलत क्या है?

जवाबों:


126

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

%option noyywrap

स्कैनर विनिर्देश में।

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


1
वास्तव में, '% विकल्प noyywrap' कहाँ जोड़ा जाना है, कृपया? परिभाषा अनुभाग में या कमांड लाइन पर?
yamex5

मैंने इसे .lफ़ाइल की शुरुआत में जोड़ा और lexइसे स्वीकार कर लिया! मुझे यकीन नहीं है कि यह सबसे अच्छी जगह है। शायद इससे कोई फर्क नहीं पड़ता।
दीपक

9

मैं अपने खुद के 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;
}

3

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

रेडहैट बेस सिस्टम पर:

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

डेबियन आधारित प्रणालियों पर

sudo apt-get install libfl-dev

2

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.