2010-04-27 16 views
5

मैं एक सी # प्रोजेक्ट में उपयोग के लिए Coco/R बनाम ANTLR का उपयोग करके मूल्यांकन कर रहा हूं जो अनिवार्य रूप से एक स्क्रिप्ट योग्य मेल-मर्ज कार्यक्षमता है। (सरल) स्क्रिप्ट को पार्स करने के लिए, मुझे पार्सर की आवश्यकता होगी।कोको/आर बनाम एएनटीएलआर

क्योंकि दोनों काफी लग रहा पर कोको/आर और ANTLR ध्यान केंद्रित किया है परिपक्व और अच्छी तरह से बनाए और सभ्य सी # पारसर्स पैदा करने में सक्षम।

न तो, या तो उपयोग करने के लिए तुच्छ होने लगते हैं तथापि, और सादगी कुछ मैं इसकी सराहना करेंगे है - दूसरों के द्वारा विशेष रूप से रख-रखाव

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

संबंधित: ठीक है, कई सवाल, जैसे 1, 2, 3, 4, 5

उत्तर

1

यदि आप बस एक जटिल टेम्पलेट में डेटा विलय कर रहे हैं, तो टेरेंस पार के StringTemplate engine पर विचार करें। वह एएनटीएलआर के पीछे आदमी है। स्ट्रिंग टेम्पलेट एक पूर्ण पार्सर जनरेटर की तुलना में बेहतर अनुकूल और उपयोग करने में आसान हो सकता है। यह एक बहुत ही सुविधा युक्त टेम्पलेट इंजन है।

downloads में एक सी # पोर्ट उपलब्ध है।

+0

मैंने देखा - आप ऐसा करने की कोशिश नहीं करेंगे? मैं एक संभावित रूप से खराब परीक्षण बंदरगाह का उपयोग करने के लिए थोड़ा सा झुकाव हूँ। –

+0

@ एरोनन नेरबोन - मैंने इसे किसी भी मुद्दे के बिना सबूत-ऑफ-अवधारणा प्रोजेक्ट में उपयोग किया है, लेकिन इस पर टिप्पणी नहीं कर सका कि यह कितनी अच्छी तरह से परीक्षण किया गया है। सौभाग्य। –

+0

यह उत्तर वास्तव में मेरी ज़रूरतों को पूरा नहीं कर सकता है - लेकिन यह निश्चित रूप से एक प्रारंभिक बिंदु है - और यह मुझे मेरे लिए सबसे अच्छा जवाब देता है :-)। –

2

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

+4

कोको में एलएल (1) प्रतिबंध इतना गंभीर नहीं है। आप ऐसे मामलों के लिए कोड हैंडलर जोड़ सकते हैं जहां आपको असंबद्ध करने की आवश्यकता है। –

+1

एएनटीएलआर शिफ्ट-कम पार्सर्स का उत्पादन नहीं करता है। यह एक एलआर पार्सर होगा जबकि एएनटीएलआर एलएल पार्सर्स का उत्पादन करेगा। –

+0

@ फ़र्नान्डो गोंज़ालेज़ सांचेज़: धन्यवाद, हाँ, मैंने इसे तब से पाया है लेकिन इस उत्तर के बारे में भूल गया - मैं संपादित करूंगा। –

3

एएनटीएलआर एलएल (*) है, जो पीईजी जितना शक्तिशाली है, हालांकि आमतौर पर अधिक कुशल और लचीला होता है। एलएल (*) के लिए एलएल (के) के लिए degenerates के लिए 1> एक मनमानी lookahead आवश्यक नहीं है।

+0

क्या एएनटीएलआर में स्कैनर के उपयोग से बचना संभव है? मैं इसके रखरखाव के बारे में थोड़ा चिंतित हूं क्योंकि व्यवहार्य टोकन का सेट सक्रिय व्याकरण नियमों पर निर्भर हो सकता है (यानी सी # में 'से' जैसे सशर्त कीवर्ड जैसे। –

+1

निश्चित रूप से। किसी भी ऑब्जेक्ट में पास करें जो टोकनस्ट्रीम लागू करता है। –

4

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

  • Antler: 260 usecs/क्वेरी और उत्पन्न पार्सर के लिए एक 108 मेगाबाइट स्मृति पदचिह्न/lexer
  • कोको: 220 usecs/क्वेरी और पार्सर/स्कैनर

के लिए एक 70 kbyte स्मृति पदचिह्न प्रारंभ में, कोको में 1.2 एमसीईसी स्टार्टअप समय था और यूटीएफ -8 मैपिंग के लिए कई 60 केबीईटीई टेबल तैयार किए थे। हमने कोको को कई स्थानीय संवर्द्धन किए हैं, जैसे कि बड़ी तालिकाओं को खत्म करने, 1.2 एमसीसी स्टार्टअप समय को समाप्त करने, अत्यधिक विस्तारित आंतरिक दस्तावेज (साथ ही जेनरेट कोड में दस्तावेज) को भी हटा दिया गया है।

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

+1

थोड़ा मेला होने के लिए, आपको ओपी को कोको में किए गए निवेश के समान स्तर के साथ एएनटीएलआर बढ़ाने पर विचार करना होगा। आपके हाथ से ट्यून किए गए "स्पीडअप" को लगभग 10-20% दिया गया है, जो पहुंच के भीतर लगता है, और मैंने सुना है कि एएनटीएलआर 4 एएनटीएलआर 3 की तुलना में तेज़ है। परिमाण स्मृति पदचिह्न के 3-आदेश बहुत अधिक दिलचस्प है; क्या आपने खोला था कि वह जगह कहाँ गई थी? –

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