2013-02-08 8 views
15

मैं verilog (या vhdl) भाषा का एक पार्सर लिखने जा रहा हूं और पार्स किए गए डेटा के बहुत सारे मैनिपुलेशन (प्रकार के परिवर्तन) करूँगा। मैं वास्तव में बड़ी फ़ाइलों को पार्स करना चाहता हूं (पूर्ण Verilog डिज़ाइन, 10K लाइनों के रूप में बड़ा) और मैं अंततः वेरिलोग का समर्थन करता हूं। मुझे टाइपिंग पर कोई फर्क नहीं पड़ता है, लेकिन जब भी मैं किसी अन्य नियम के लिए समर्थन जोड़ता हूं तो मैं कोड के किसी हिस्से को फिर से लिखना नहीं चाहता हूं।पारसी या खुश (एलेक्स के साथ) या यूयू-पार्सिंगलिब

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

तो verilog/VHDL के पूर्ण व्याकरण को पार्स करने के लिए उनमें से एक की सिफारिश की जाती है? मेरी मुख्य चिंता आसानी और 'शुद्धता' है जिसके साथ मैं अपने whim पर पार्स किए गए डेटा में हेरफेर कर सकता हूं। गति प्राथमिक चिंता नहीं है।

+0

यह एक विशाल परियोजना है। एक Verilog पार्सर बहुत जटिल है। –

+4

हां, वास्तव में। Verilog के कुछ हिस्से का समर्थन करने के लिए पर्याप्त है यह दिखाने के लिए पर्याप्त है कि मैं अपने पीएचडी के दौरान verilog के साथ करना चाहता हूँ। लेकिन मैं अपने पीएचडी के बाद भी इसे जारी रखना चाहता हूं। तो यह वास्तव में एक दीर्घकालिक निवेश है। मैं जानना चाहता हूं कि हास्केल बिल फिट बैठता है या नहीं। मुझे यह भाषा पसंद है। – Dilawar

+1

तो, अंत में आपने क्या किया? क्या आप अपनी पसंद से खुश हैं? – Schiavini

उत्तर

19

मैं व्यक्तिगत रूप से लेक्सिंग के लिए एलेक्स की सहायता से पारसेक पसंद करता हूं।

मैं परसेक को पसंद से अधिक पसंद करता हूं क्योंकि 1) पारसी एक पुस्तकालय है, जबकि हैप्पी एक प्रोग्राम है और यदि आप हैप्पी का उपयोग करते हैं और फिर हैप्पी के साथ संकलित करते हैं तो आप एक अलग भाषा में लिखेंगे। 2) पारसी आपको संदर्भ-संवेदनशील पार्सिंग क्षमताओं को इसके monadic इंटरफेस के लिए धन्यवाद देता है। आप संदर्भ-संवेदनशील पार्सिंग के लिए अतिरिक्त स्थिति का उपयोग कर सकते हैं, और उसके बाद उस स्थिति के आधार पर निरीक्षण और निर्णय ले सकते हैं। या बस कुछ पार्स किए गए मान को देखें और अगले पार्सर्स आदि पर निर्णय लें (जैसे a <- parseSomething; if test a then ... do ...) और जब आपको किसी संदर्भ-संवेदनशील जानकारी की आवश्यकता नहीं होती है, तो आप केवल आवेदक शैली का उपयोग कर सकते हैं और वाईएसीसी या इसी तरह के टूल में कार्यान्वित करने जैसे कार्यान्वयन प्राप्त कर सकते हैं। ।

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

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

आप एलेक्स + पारसेक में लागू Lua parser पर देख सकते हैं और यहां code to use Alex-generated tokens in Parsec है।

संपादित करें: धन्यवाद John L सुधार के लिए। जाहिर है आप भी हैप्पी के साथ संदर्भ-संवेदनशील पार्सिंग कर सकते हैं। इसके अलावा, हैक्स में लेक्सिंग के लिए एलेक्स की आवश्यकता नहीं है, हालांकि इसकी अनुशंसा की जाती है।

+0

अपने लुआ पार्सर को साझा करने के लिए धन्यवाद। मांस में एलेक्स को देखने में मददगार है, न कि दस्तावेज से कुछ खिलौने उदाहरण। अपने काम को साझा करने के लिए –

+0

+1। – Dilawar

+4

इस उत्तर में खुश होने से संबंधित अधिकांश विवरण गलत हैं।हैप्पी संदर्भ-संवेदनशील पार्सिंग का समर्थन करता है (क्योंकि पार्सर्स मनमाने ढंग से monads में चलाया जा सकता है)। हैप्पी को एलेक्स की आवश्यकता नहीं है, आप किसी भी लेजर का उपयोग कर सकते हैं। आप सीधे हैप्पी में लेक्सिंग भी कर सकते हैं, हालांकि इसकी अनुशंसा नहीं की जाएगी। –

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