2011-07-09 28 views
5

के साथ एक Yacc/Bison पार्सर इंटरफ़ेस करना यह this question का डुप्लिकेट नहीं है क्योंकि समाधान एक पार्सर का उपयोग नहीं करना था!एक सी ++ प्रोग्राम

मेरे पास एक Bison पार्सर है जिसे मैं ./parser < file_to_parse कर कर चला सकता हूं। मैं अपने सी ++ कार्यक्रम के भीतर से Bison पार्सर को कॉल करना चाहता हूं। जो मैं नहीं चाहता वह system(./parser < file_to_parse) करना है क्योंकि यह मान लेगा कि पार्सर प्री-संकलित है और फिर मेरा पूरा कार्यक्रम प्लेटफ़ॉर्म स्वतंत्र नहीं होगा।

अगर मैं एक समारोह है:

void foo(file_name) { 
    // call parser on file_name 
} 

तो यह कैसे किया जा सकता है? कोई विचार? मुझे लगता है कि यह यद्यपि या कुछ कहने का मामला है, लेकिन मुझे इसके साथ कहीं भी नहीं मिल रहा है!

धन्यवाद :)।

उत्तर

1

यह वही है जो आप करते हैं - आप yyparse() को कॉल करते हैं। आप yylex() लिखते हैं जैसे कि आपका मुख्य प्रोग्राम इसके इनपुट को निर्दिष्ट कर सकता है। संभवतः आपके वर्तमान yylex() getchar() या किसी चरित्र को पढ़ने के लिए कुछ कहते हैं; इसके बजाय आपको अपने मुख्य कार्यक्रम द्वारा निर्दिष्ट कुछ जगहों से इनपुट लेने के लिए इसे लिखने की आवश्यकता होगी।

+0

धन्यवाद अर्नेस्ट .. अभी भी संघर्ष कर रहा हूं लेकिन उम्मीद है कि मैं वहां जाऊंगा। मेरे पास वास्तव में मेरे लेक्सर में yylex() नहीं है - फ्लेक्स एक डिफ़ॉल्ट बनाता है जो शायद getchar() करता है। मुझे लगता है मुझे लेक्सर या कुछ में अपना खुद लिखना होगा। – ale

2

क्या आप ऐसे संस्करण का उपयोग कर रहे हैं जो C++ के अनुकूल है?

मैं एलेन कोटेमूर द्वारा इसका उपयोग करता हूं।

फिलहाल, मेरे पास केवल फ्लेक्स ++ को नियोजित करने के लिए कोड आसान है, लेकिन यह आपको दिखाएगा कि यह कैसा चल रहा है।

जब आप फ्लेक्स ++ चलाते हैं तो यह एक शीर्षलेख फ़ाइल आउटपुट करेगा और पार्सिंग करने के लिए एक नई कक्षा के लिए एक कार्यान्वयन फ़ाइल आउटपुट करेगा। इन्हें अपनी परियोजना में जोड़ें, फिर लिखें:

// Construct new instance of parser 
::lex * plex = new lex(); 

// tell parser what file to parse 
plex->yyin = _wfopen(L"C:/Documents and Settings/All Users/Application Data/QuietWake/eCrew/new_rules_to_be_parsed.txt",L"r"); 

// run the parser 
int lex_return = plex->yylex(); 
+0

धन्यवाद। मैं वास्तव में पुराने फ्लेक्स/बाइसन का उपयोग कर रहा हूं .. मुझे पता था कि कल सी ++ थे! .. आप जिस इस्तेमाल का उपयोग कर रहे हैं उसका उपयोग करने के लिए निश्चित रूप से बेहतर होगा। मैं अपने टूल्स का उपयोग करके इसे हल करने और हल करने जा रहा हूं और यदि यह विफल हो जाता है तो मैं इन सी ++ वाले को देखूंगा। धन्यवाद +1। – ale

+0

मैं अब बदलाव करने की सलाह देते हैं। नए पार्सर्स पुराने के साथ संगत हैं, इसलिए आप स्क्रिप्टिंग में कोई निवेश नहीं खो देंगे। और जीवन इतना आसान होगा। – ravenspoint

+0

मैं फंस गया हूं इसलिए मैं बस ऐसा करने जा रहा हूं :)। अगर यह काम करता है तो समाधान के रूप में चिह्नित होगा। धन्यवाद। – ale

1

यह सी कोड है लेकिन मुझे लगता है कि यह सी ++ के लिए भी एक संकेतक मामला होगा।
जब हम विश्वविद्यालय में एक संकलक करना था कि हम एक .l फ़ाइल इस तरह में YY_DECL को परिभाषित करने के लिए किया था:

 
#define YY_DECL int alpha_yylex(yylval_) void *yylval_; 

int alpha_yylex(yylval_) समारोह है और void *yylval पैरामीटर प्रकार है।
स्पष्ट रूप से, आपको यह जानने की ज़रूरत है कि पार्सर को यह पता होना चाहिए कि उर्फ ​​से कहां से शुरू करना है, जिस पर काम करना चाहिए।

आपको अपने .y फ़ाइल में इस फ़ंक्शन प्रोटोटाइप (extern int alpha_yylex(void *yylval_);) को भी बाहर करने की आवश्यकता है।
उसके बाद फ्लेक्स/बाइसन उपयोगिताओं आपके लिए प्रासंगिक .c फ़ाइलों को स्वत: उत्पन्न कर देंगे।

सामान्य रूप से, .l शब्दावली नियमों के लिए है और .y व्याकरण नियमों के लिए है। इसलिए यदि आप मूल्य प्राप्त करने के लिए कहीं से आप इस तरह .y (एक उदाहरण) में एक संघ को परिभाषित करना होगा की जरूरत है:

%union { 

    union { 
     int Integer; 
     double Double; 
     char Character; 
     char* String; 
    } value; 

} 

फिर, अपने वाक्य और नियमों के आधार पर आप yylval.value.String = strdup(yytext) अपने .l file में कर सकते हैं और, आपके व्याकरण नियमों के आधार पर, $$.Double = $1.Double + $3.Double आपके .y फ़ाइल में।

मैं एक बहुत याद नहीं है के बाद से यह एक समय है कि मुझे लगता है कि किया है लेकिन मुझे लगता है कि तुम कोशिश कर सकते हैं और आप दस्तावेज़ देखें या यहाँ पूछना :) सकते हो गया है

पुनश्च: एक (मैं था अच्छा एफएक्यू कहीं और यह याद नहीं कर सकता कि यह बिल्ली कहां है -> बाद में पोस्ट करेगा यदि मैं इसे खोजने के लिए भाग्यशाली हूं xD: D xD)

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