scala - क्या एचएसकेएल या स्कला जैसी कार्यात्मक भाषाओं के लिए कोई एलएल पार्सर जेनरेटर है?




haskell functional-programming (4)

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

मैं इस भाषा का पार्सर संक्रमित करना चाहता हूं जिस पर मैं काम कर रहा हूं, जिस पर एएनटीएलआर से भाषा में स्वयं-होस्ट करने के लिए कार्यात्मक विशेषताएं हैं, और अगर मैं अपनी भाषा कुछ बंद कर सकता हूं तो वह निश्चित रूप से किसी अन्य कार्यात्मक भाषा में सही होगा (अधिमानतः मैं, हास्केल और स्कला से परिचित हूं), इसे पूरी तरह से खरोंच से लिखना के बजाय, हालांकि अंत में मैं ऐसा कर सकता हूं, क्योंकि मूल भाषा छोटा है

इस बिंदु पर एक समाधान भी नहीं है, इसलिए मैं बहुत ही उत्सुक हूं कि एलएल (कश्मीर) पार्सर जेनरेटर क्यों नहीं हैं, लेकिन कई एलआर जेनरेटर हैं, क्योंकि एलएलआर स्वाभाविक रूप से आसान है।


एसएमएल में एमएल-एंट्ल्र को कुछ सालों से अब मिला है:

http://www.classes.cs.uchicago.edu/archive/2007/winter/22610-1/docs/lpt-manual.pdf

स्कीम के लिए स्ललें भी है।

एलएल वालों की तुलना में एलआर पार्सर जनरेटर क्यों हैं? एलआर पार्सर को हाथ से लिखना मुश्किल है, इसलिए आपको वास्तव में जनरेटर की जरूरत है। एलएल पार्सर के साथ, एक हाथ से कोडित कार्यान्वयन अभी भी व्याकरण से मेल खाता है, इसलिए जनरेटर के लिए बहुत कम आवश्यकता है


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


इसके लिए प्रमुख कारण यह है कि ज्यादातर एलएल (कश्मीर) पार्सर्स जो कि कार्यात्मक भाषाओं में लिखे गए हैं, सिर्फ पार्सर कंग्नेटर्स का उपयोग करते हुए कार्यान्वित होते हैं, क्योंकि एक पारसर संयोजक पुस्तकालय उत्पन्न करने का सबसे आसान तरीका पुनरावर्ती वंश है

हास्केल का पार्स , एटोपार्स , और पॉलीपार्स और स्काला के शेयर पार्सर कंग्नेटर्स सभी उत्पादन प्रभावी रूप से एलएल (*) पार्सर हैं।

दोनों parsec और एटोपर्स के लिए आपको पीछे की तरफ देखने के लिए एक स्पष्ट प्रयास संयोजक का उपयोग करने की आवश्यकता होती है, लेकिन यह केवल दक्षता के लिए किया जाता है और स्केल पार्सर संयोजन भी पैकेट्रेट पार्सिंग से निपट सकता है।

ब्रेंट यॉर्ज़ी के हाल के अनबाउंड पैकेज की घोषणा से निम्नलिखित टुकड़े पर विचार करें:

parseAtom = parens parseTerm
    <|> var <$> ident
    <|> lam <$> brackets ident <*> parseTerm

यह मूल व्याकरण को देखना बहुत आसान है

एलआर पार्सर को कुशलतापूर्वक निष्पादित करने के लिए तालिकाओं को उत्पन्न करने के लिए बहुत अधिक जटिल प्रीप्रोसेसिंग की आवश्यकता होती है, चूंकि रिकर्सिव चढ़ाई की तरह कुछ का उपयोग करते हुए प्रत्यक्ष हाथ एन्कोडिंग बहुत भयानक है

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


आपने मुझे एक पुरानी शौक परियोजना https://github.com/nrnrnr/ebnf पर पोस्ट करने के लिए प्रेरित किया है। यह स्टैंडर्ड एमएल के लिए एलएल (1) पार्सर पीढ़ी का समर्थन करता है हास्केल के अनुकूल होना मुश्किल नहीं होगा, बशर्ते आप उस व्यक्ति को ढूंढ सकें जो चिह्न को समझता है।

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

ईएनबीएफ़ का प्राथमिक लाभ इसकी संकेतन है: अनुक्रम, Maybe प्रकार और आरक्षित शब्द सभी मूल रूप से समर्थित हैं, कोई अतिरिक्त उपद्रव नहीं के साथ।





parser-generator