2009-12-03 11 views
8

व्याकरण वाली फ़ाइल से सी ++ में पार्सर बनाने का सबसे अच्छा तरीका क्या है?सी ++ एक पार्सर

+5

'व्याकरण के साथ फ़ाइल' क्या प्रारूप है? –

+1

http://stackoverflow.com/questions/1669/learning-to-write-a-compiler यहां चारों ओर संकलक और दुभाषियों के बारे में कैननिकल प्रश्न है। वहां बहुत अच्छे लिंक हैं। एक हाथ के लिए रिकर्सिव सभ्य दृष्टिकोण बनाया गया, क्रैनशॉ ट्यूटोरियल देखें। – dmckee

उत्तर

17

के उपयोग के सुझाव देंगे तुम भी इन कड़ियों पर एक नजर है करने के लिए चाहते हो सकता है:

+0

मैं दूसरा हूं। बूस्ट प्रलेखन वास्तव में सहायक है। – anno

+1

यदि आप किसी भी सभ्य आकार के कंपाइलर पर योजना बनाते हैं तो 'बूस्ट :: भावना' का उपयोग न करने का सुझाव देंगे - 'बूस्ट :: भावना' के साथ बनाए गए पार्सर्स के लिए संकलन समय बहुत बड़ा हो जाता है, जिससे पीआईटीए में बहुत छोटे बदलाव होते हैं (क्योंकि पूरी बात टेम्पलेट्स के साथ की जाती है) –

8

flex और bison हैं। लेक्स & वाईएसी चचेरे भाई जो खाते में सी ++ अस्तित्व लेते हैं।

3

क्या आपने Lex and Yacc पर देखा है? खंड 5 से जुड़ा हुआ दस्तावेज़ के शब्दों में:

मेरे पसंदीदा एक सी बनाने के लिए जिस तरह से ++ पार्सर लेक्स एक सादे सी फाइल उत्पन्न करने के लिए, और YACC सी ++ कोड उत्पन्न जाने के लिए है। जब आप अपने एप्लिकेशन को लिंक करते हैं, तो आप समस्याओं में भाग सकते हैं क्योंकि डिफ़ॉल्ट रूप से C++ कोड C फ़ंक्शंस नहीं ढूंढ पाएगा, जब तक कि आपने यह नहीं बताया कि वे फ़ंक्शन बाहरी "सी" हैं।

+0

फ्लेक्स और वाईसन द्वारा लेक्स और वाईएसी को आगे बढ़ाया गया है। –

2

एक पार्सर बनाने का सबसे अच्छा तरीका लेक्स और yacc का उपयोग करना है।

+3

कोई भी * सर्वश्रेष्ठ * के बारे में प्रश्न का उत्तर नहीं दे सकता है, लेकिन आप वास्तव में करीब आ गए हैं - लेक्स और वाईएसी चचेरे भाई फ्लेक्स और बाइसन खाते में सी ++ लेते हैं। –

+0

मैं मान रहा था कि प्रश्न सी ++ में हाथ से एक पार्सर लिखने के बारे में था। – Dima

2

मैंने bison का उपयोग किया है, उदाहरणों को मेरे स्तर के लिए सही मिला है। इसके साथ एक सरल कैलकुलेटर बनाने में सक्षम था, बेशक यह और भी बहुत कुछ कर सकता है।

कैलकुलेटर उदाहरण के लिए 1 + 2 * 3 लिया और एक वाक्यविन्यास पेड़ बनाया। दस्तावेज ने वर्णन नहीं किया कि पेड़ का निर्माण कैसे किया जाए और मुझे काम करने के लिए थोड़ा समय लगे।

यदि मैं फिर से जा रहा था तो मैं 'antlr' में देखता हूं क्योंकि यह अच्छा और अच्छी तरह से समर्थित था।

मार्टिन।

9

यह व्याकरण पर भारी निर्भर करता है। मुझे रिकर्सिव वंश पार्सर्स पसंद हैं, जिन्हें आम तौर पर हाथ से लिखा जाता है (हालांकि व्याकरण के विवरण से उत्पन्न करना संभव है)।

यदि आप एक पार्सर जनरेटर का उपयोग करने जा रहे हैं, तो वास्तव में दो अच्छे विकल्प हैं: Byacc और Antlr। यदि आप कुछ ऐसा (उचित रूप से) yacc के साथ संगत चाहते हैं, तो बाईक (दूर तक) आपकी सबसे अच्छी पसंद है। यदि आप शुरुआत से शुरू कर रहे हैं, न तो मौजूदा कोड और न ही अनुभव जो Yacc के साथ संगत कुछ का उपयोग करने का पक्ष लेता है, तो एंटरल निश्चित रूप से आपकी सर्वश्रेष्ठ शर्त है।

चूंकि इसका उल्लेख किया गया है, मैं भी बाइसन के बारे में कुछ बात करूंगा। मैं बाइसन को इस प्लेग की तरह टालना चाहूंगा कि यह है। "एक दूर फेंकने की योजना" के लिए ब्रूक्स की सलाह यहां लागू होती है। रॉबर्ट कॉर्बेट (बाएक के लेखक) ने बाइसन को एक पार्सर जेनरेटर में अपना पहला प्रयास बताया। दुर्भाग्यवश, उसने इसे फेंकने के बजाय जीएनयू को दिया। तकनीकी उत्कृष्टता को मारने के विपणन के क्लासिक मामले में, बायसन का व्यापक रूप से उपयोग किया जाता है (और यहां तक ​​कि उन लोगों द्वारा भी सिफारिश की जाती है जो बेहतर नहीं जानते) जबकि बाक अपेक्षाकृत अस्पष्ट रहता है।

संपादित करें: मुझे ऐसा करने से नफरत है, लेकिन चूंकि इसका भी उल्लेख किया गया है, मैं Boost.spirit पर भी टिप्पणी करूंगा। हालांकि यह टेम्पलेट मेटा प्रोग्रामिंग का सबसे अच्छा उदाहरण हो सकता है, इसमें कुछ समस्याएं हैं जो मुझे गंभीर उपयोग करने की कोशिश करने के खिलाफ अनुशंसा करने के लिए प्रेरित करती हैं।

  1. इसके साथ संकलन समय परेशान हो सकता है - 10 मिनट आम है, और एक बड़ा/अधिक जटिल व्याकरण अब भी ले सकता है (माना जाता है कि यह संकलक को क्रैश नहीं करता है)।
  2. यदि आप कोई गलती करते हैं, तो यह अक्सर और लंबे समय तक त्रुटि संदेश उत्पन्न करेगा जो समझने के लिए लगभग असंभव हैं। टेम्पलेट-भारी कोड से त्रुटि संदेश वैसे भी कुख्यात रूप से खराब हैं, और आत्मा लगभग किसी भी चीज़ से अधिक प्रणाली पर जोर देती है।

मेरा विश्वास करो: तथ्य यह है कि आप आत्मा की तरह कुछ लिख सकते हैं, प्रभावशाली और अद्भुत के बीच की सीमा पर सही है - लेकिन मैं अभी भी इसका उपयोग करूँगा अगर मुझे यकीन था कि व्याकरण मैं किससे व्यवहार कर रहा था (और हमेशा रहेगा) काफी छोटे और सरल।

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