2013-02-06 12 views
7

के साथ लेखन LLVM tutorials में सरल जेआईटी कंपाइलर लिखने का निर्देश है। दुर्भाग्यवश, इस ट्यूटोरियल में लेक्सर और पार्सर मैन्युअल रूप से लिखा गया है। मैं सोच रहा था, ऐसा समाधान सीखने के उद्देश्यों के लिए अच्छा है लेकिन यह जटिल, उत्पादन तैयार कंपाइलर लिखने के लिए उपयुक्त नहीं है। ऐसा लगता है कि जीसीसी और कुछ अन्य "बड़े कंपाइलर" हाथ लिखे गए हैं। लेकिन मुझे लगता है कि, ये सभी पार्सर जनरेटर अपने संकलक लिखते समय एक बड़ा बढ़ावा देते हैं (विशेष रूप से जब आप इसे अकेले कर रहे हैं, लोगों की टीम के बिना)।एलएलवीएम जेआईटी पार्सर बायिसन/एंटलर/पैक्रेट/एल्खाउंड/

क्या जेआईटी कंपाइलर बनाने के लिए एलएलवीएम के साथ एक मौजूदा पार्सर जनरेटर जैसे बाइसन/एंटर/पैक्रेट/एल्खाउंड इत्यादि का उपयोग करना संभव है? मैं अभिव्यक्ति के साथ लगातार पार्सर (शुरुआत में नहीं) को "फ़ीड" करने में सक्षम होना चाहता हूं और उन्हें रनटाइम में संकलित करना चाहता हूं।

अतिरिक्त मुझे "सर्वश्रेष्ठ, आधुनिक" पार्सर जेनरेटर (इस तरह: https://stackoverflow.com/questions/428892/what-parser-generator-do-you-recommend) के बारे में बहुत सारे प्रश्न मिल गए हैं। यदि एलएलवीएम जेआईटी कंपाइलर बनाने के लिए इन उपकरणों का उपयोग करना संभव है, तो मैं किसी भी अतिरिक्त संकेत और अनुशंसा के लिए आभारी हूं, जो इस विशेष मामले में प्रदर्शन और लचीलापन के मामले में कौन सा उपकरण सबसे अच्छा होगा।

+0

"ऐसा समाधान सीखने के उद्देश्यों के लिए अच्छा है लेकिन यह जटिल, उत्पादन तैयार कंपाइलर लिखने के लिए उपयुक्त नहीं है" - एचएम। मैंने हमेशा सोचा कि जीसीसी एक जटिल और उत्पादन तैयार कंपाइलर था। जो कुछ भी ... –

+0

जीसीसी शुरुआत में बाइसन का उपयोग कर रहा था, लेकिन आप सही हैं - मैं इसे अपने प्रश्न में ठीक कर रहा हूं। लेकिन वास्तव में, यदि संभव हो तो मुझे इस कार्य को सरल बनाने के लिए जनरेटर का उपयोग करना अच्छा लगेगा। –

+5

यदि कुछ भी है, तो मैं कहूंगा कि इसके विपरीत यह सच है: yacc, bison, et al, सीखने के उद्देश्यों के लिए उपयुक्त हैं और ऐसे में, लेकिन गंभीर उत्पादन कार्य के लिए, एक हाथ से लिखित पार्सर आवश्यकताओं को पूरा करने का एकमात्र तरीका हो सकता है। –

उत्तर

9

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

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

सामान्य कारण यह है कि लोग अंततः अपने स्वयं के पार्सर्स बनाने का विकल्प चुनते हैं, "असली प्रोग्रामर पार्सर जेनरेटर" पूर्वाग्रह का उपयोग नहीं करते हैं, यह है कि सिंटैक्स त्रुटियों के लिए विशेष निदान प्रदान करना आसान नहीं है, खासकर एलआर (1) पार्सिंग। यदि यह आपके लक्ष्यों में से एक है, तो आपको अपने व्याकरण एलएल (के) को दृष्टांत बनाने की कोशिश करनी चाहिए (एलएल (के) के साथ अच्छा निदान प्रदान करना अभी भी आसान नहीं है, लेकिन यह थोड़ा आसान लगता है) और एलएल (के) का उपयोग करें Antlr की तरह ढांचा।

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

व्यक्तिगत रूप से, मैं पैक्रेट पार्सिंग के खिलाफ पक्षपातपूर्ण हूं, क्योंकि यह स्पष्ट नहीं है कि पीईजी द्वारा वास्तविक भाषा का विश्लेषण किया गया है। अन्य लोगों को यह इतना बुरा नहीं लगता है, और वाईएमएमवी।

+1

यह क्यों "स्पष्ट नहीं है" वास्तविक भाषा क्या है? पीईजी अच्छी तरह से परिभाषित है, यहां तक ​​कि सभी ठंडा हैक्स जो पैट्रेट करने की अनुमति देता है (उच्च-आदेश पार्सिंग और ऐसे)। –

+1

@ एसके-तर्क: अच्छी तरह से परिभाषित स्पष्ट के समान नहीं है। सी ++ में लिखा गया एक हाथ से तैयार पार्सर अच्छी तरह परिभाषित है। एक ट्यूरिंग मशीन अच्छी तरह से परिभाषित है। हां, पीईजी अच्छी तरह से परिभाषित है। लेकिन उन सभी के लिए, यह देखने का एकमात्र तरीका है कि भाषा में दी गई स्ट्रिंग कोड को निष्पादित करना है या नहीं। (उन तीन विकल्पों में से, पीईजी कम से कम बुरा है, इमो। लेकिन मैं अभी भी औपचारिक संदर्भ मुक्त व्याकरण पसंद करता हूं। हालांकि, जैसा कि मैंने कहा, पीईजी जैसे अन्य लोग, और जो भी आपके लिए काम करता है वह मेरे साथ अच्छा है।) – rici

+0

मेरे व्यावहारिक अनुभव से , पीईजी सबसे स्पष्ट और व्याकरण पढ़ने के लिए आसान हैं। मैं बहुत कम संशोधनों के साथ सीधे एक पीईजी में एक भाषा spec का अनुवाद कर सकते हैं। निश्चित रूप से इसे खराब करना संभव है, लेकिन मैंने अभी तक वास्तव में एक खराब व्याकरण नहीं देखा है। जबकि Yacc व्याकरण की उम्मीद से परे कई अपठनीय हैं। –

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