2012-07-26 6 views
7

मैं अपने प्रोजेक्ट में flex और bison उपयोग करने के लिए एक फ़ाइल संरचना के लिए एक पार्सर कोड उत्पन्न करने के लिए कोशिश कर रहा हूँ। मुख्य प्रोग्रामिंग भाषा सी ++ है और प्रोजेक्ट एक ओओ डिज़ाइन पर है जो मुख्य रूप से समानांतर में चल रहा है।फ्लेक्स ++ BisonC++ पार्सर

मैंने सुना है कि flex और bison जेनरेट किए गए पार्सर्स सी कोड हैं और वे पुनर्विक्रेता नहीं हैं। गुगलिंग, मुझे flex++ और bisonc++ मिला। दुर्भाग्य से शुरू करने के लिए कोई आसान ट्यूटोरियल नहीं है। अधिकांश उदाहरण bison/flex पर आधारित हैं। कुछ लोगों ने किसी भी तरह अपने सी ++ कोड में bison/flex पार्सर्स को एकीकृत किया। उन्हें "मुश्किल" होना चाहिए ...

flex++ और bisonc++ का दस्तावेज़ीकरण मेरी मदद नहीं करता है। ट्यूटोरियल और उदाहरण, वे सभी stdin से इनपुट प्राप्त करते हैं और stdout पर कुछ संदेश मुद्रित करते हैं।

मैं अपने पार्सर में इन सुविधाओं की जरूरत है:

  1. पार्सर एक सी ++ वर्ग, सामान्य तरीके से (एक शीर्षक और एक cpp फ़ाइल)
  2. पार्सर से डेटा प्राप्त में परिभाषित किया जाना चाहिए या तो एक std::string या std::stringstream या एक शून्य-समाप्त char*

मैं बहुत उलझन में लग रहा है। क्या मुझे flex++/bisonc++ या flex/bison का उपयोग करना चाहिए? और यह कैसे करें, शर्तों से संतुष्ट?

उत्तर

3

फ्लेक्स/बायसन, फ्लेक्स ++/जंगली भैंसों ++ और flexC++/bisonC++ रहे हैं। मुझे लगता है कि इन तीन जोड़े में से एक को फ्लेक्स ++ और बाइसन ++ मिश्रण/मिलान करने के बजाय सबसे अच्छा है। यहाँ Flexc++ और Bisonc++ के लिए उपयोगकर्ता गाइड कर रहे हैं।

FlexC++ वेबसाइट से:

FlexC++ फ्लेक्स और फ्लेक्स के लिए ++ विपरीत, कि है स्पष्ट रूप से सी ++ प्रोग्राम द्वारा उपयोग के लिए कोड उत्पन्न करता है। जाने-माने फ्लेक्स (1) प्रोग्राम सी स्रोत कोड उत्पन्न करता है और फ्लेक्स ++ (1) केवल एक सी ++ प्रदान करता है - जैसे फ्लेक्स (1) द्वारा उत्पन्न येलैक्स फ़ंक्शन के आसपास खोल और शायद ही सी ++ सॉफ़्टवेयर विकास के बारे में वर्तमान-दिन के विचारों का समर्थन करता है । इसके विपरीत, flexC++ नियमित अभिव्यक्तियों के साथ एक पूर्वनिर्धारित सदस्य फ़ंक्शन लेक्स मिलान इनपुट और नियमित रूप से सी ++ कोड निष्पादित करने के बाद नियमित अभिव्यक्तियों का मिलान करने के बाद एक सी ++ कक्षा बनाता है। FlexC++ द्वारा उत्पन्न कोड शुद्ध सी ++ है, जो इसके उपयोगकर्ताओं को उस भाषा द्वारा प्रदान की जाने वाली सुविधाओं के सभी को लागू करने की इजाजत देता है।

BisonC++ वेबसाइट से:

BisonC++ एक सामान्य प्रयोजन पार्सर जेनरेटर है कि एक व्याकरण वर्णन एक LALR के लिए करने के लिए एक सी ++ वर्ग में (1) विषय से मुक्त व्याकरण धर्मान्तरित कि व्याकरण पार्स है । एक बार जब आप bisonC++ के साथ कुशल हो जाते हैं, तो आप का उपयोग भाषा पार्सर्स की विस्तृत श्रृंखला विकसित करने के लिए कर सकते हैं, जटिल डेस्क कैलकुलेटर में जटिल प्रोग्रामिंग भाषाओं में उपयोग किए गए लोगों से। BisonC++ अत्यधिक कार्यक्रम जंगली भैंसों ++, एलेन Coetmeur द्वारा लिखित के बराबर है: सब ठीक से लिखा जंगली भैंसों ++ व्याकरण बहुत कम या कोई परिवर्तन के बाद bisonC++ व्याकरण के लिए परिवर्तनीय होना चाहिए। बाइसन ++ या इसके अग्रदूत, बाइसन से परिचित कोई भी छोटी परेशानी के साथ bisonC++ का उपयोग करने में सक्षम होना चाहिए। में BisonC++ का उपयोग करने या इस मैनुअल को समझने के लिए आपको C++ प्रोग्रामिंग का उपयोग करने में धाराप्रवाह होना चाहिए।

तो flexC++/bisonC++ सिर्फ पुराने फ्लेक्स/जंगली भैंसों उपयोगिताओं के आसपास रैपर की तुलना में अधिक हैं। वे फिर से प्रवेश स्कैनिंग/पार्सिंग के लिए उपयोग किए जाने वाले पूर्ण सी ++ वर्ग उत्पन्न करते हैं।

+0

मैं flexC++ संकलित भी नहीं कर सकता! बस डाउनलोड स्रोत कोड। कोई मेकफ़ाइल नहीं, कोई सेमीक नहीं! –

+0

@ sorush-r एक लिनक्स पैकेज है: http://packages.debian.org/sid/flexc++ आपको मेकफ़ाइल क्यों चाहिए? बस हेडर शामिल करें और अपने पर्यावरण से बनाएं। – TemplateRex

+1

मैंने पहले 'आईसीएमके' के बारे में नहीं सुना था। ऐसा लगता है कि 'flexC++' संकलित करने के लिए प्रयुक्त बिल्ड सिस्टम है। धन्यवाद –

2

फ्लेक्स एक रैत्रांत सी स्कैनर उत्पन्न कर सकते हैं। फ्लेक्स मैनुअल में सेक्शन 19 Reentrant C scanners देखें।

इसी तरह, बाइसन एक पुनर्विक्रेता सी पार्सर उत्पन्न कर सकता है। विवरण के लिए बाइसन मैनुअल में सेक्शन 3.8.11 A Pure (Reentrant) Parser देखें।

आप पूरी तरह एक सी ++ पार्सर और std :: स्ट्रिंग/stringstream आधारित पार्सर डेटा है की जरूरत है?

आप एक विकल्प के रूप Boost.Spirit को देखा है?

+0

नहीं। मैं पार्स किए जाने के लिए 'char *' s उत्पन्न करने के लिए अपना कोड बदल सकता हूं। Bu 'stdin' –

+1

@ sorush-r से इनपुट पढ़ने में सक्षम नहीं है: आप' YY_INPUT() 'मैक्रो को फिर से परिभाषित करके अपने फ्लेक्स सी स्कैनर इनपुट के स्रोत को बदलने में सक्षम होना चाहिए। फ्लेक्स मैनुअल में [सेक्शन 9 जेनरेटेड स्कैनर] (http://flex.sourceforge.net/manual/Generated-Scanner.html#Generated-Scanner) देखें। मैं Boost.Spirit पर भी एक गंभीर नजर डालना होगा। – Void