2010-06-22 23 views
9

मैं वर्तमान में एक लेक्सर/पार्सर की तलाश कर रहा हूं जो बीएनएफ व्याकरण (ocamlyacc फ़ाइल प्राथमिकता और सहयोगीता से) से स्कैला कोड उत्पन्न करता है। मैं काफी उलझन में हूं क्योंकि मुझे यह करने के लिए लगभग कुछ भी नहीं मिला है।बीएनएफ व्याकरण से स्कैला कोड उत्पन्न करने के लिए लेक्सर/पार्सर

पार्सिंग के लिए, मुझे scala-bison मिला (कि मुझे काम करने में बहुत परेशानी है)। अन्य सभी टूल स्कैला में आयात किए गए जावा पार्सर्स हैं (जैसे ANTLR)।

लेक्सिंग के लिए, मुझे कुछ भी नहीं मिला।

मैंने यह भी पाया प्रसिद्ध पार्सर combinators स्काला के, लेकिन (मुझे ठीक कर लें मैं गलत हूँ), भले ही वे काफी आकर्षक हैं, वे मुख्य रूप से की वजह से उलटे पांव लौटने करने के लिए समय और स्मृति का उपयोग करते हैं,।

  • क्यों लोगों को केवल _parser combinators पर ध्यान केंद्रित करने लगते है:

    तो मैं दो मुख्य प्रश्न हैं?

  • स्कैला के साथ उपयोग करने के लिए आपका सबसे अच्छा लेक्सर/पार्सर जेनरेटर सुझाव क्या है?

उत्तर

7

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

अपने विकास के लिए, मैं स्कैनरलेस पार्सिंग तकनीकों के साथ बहुत कुछ कर रहा हूं। स्कैला 2.8 के पैट्रेट पार्सर संयोजक काफी अच्छे हैं, हालांकि अभी भी सामान्यीकृत नहीं हैं। मैंने an experimental library बनाया है जो पार्सर संयोजक ढांचे के भीतर सामान्यीकृत पार्सिंग लागू करता है। इसकी एसिम्प्टोटिक सीमा पारंपरिक पार्सर संयोजकों की तुलना में काफी बेहतर है, लेकिन व्यवहार में निरंतर समय ओवरहेड अधिक है (मैं अभी भी इस पर काम कर रहा हूं)।

+0

उत्तर और आपके जीएल संयोजकों के लिए धन्यवाद, मैं यह समझने की कोशिश करूंगा कि यह कैसे काम करता है :) लेकिन मुझे लगता है कि मैं एक साथ जेएफएक्स और स्कैला के साथ खेलने की कोशिश करूंगा। – Vinz

+1

सभी ट्यूटोरियल के लिए धन्यवाद (कोडकैट पर आपके कुछ सहित) मैं अंततः पार्सर संयोजकों के साथ एक सरल लेक्सर/पार्सर करने में कामयाब रहा, और बहुत अधिक रिकर्सन के बिना .. धन्यवाद! – Vinz

3

स्कैला 2.8 में एक पैट्रेट पार्सर है। मैं यहाँ एपीआई डॉक्स से बोली:

packrat पार्सिंग को लागू करने बैक ट्रैकिंग, रिकर्सिव-डिसेंट पारसर्स, लाभ यह है कि गारंटी देता है असीमित अग्रदर्शी और एक रेखीय पार्स समय के साथ के लिए एक तकनीक है। इस तकनीक का उपयोग करके, बाएं रिकर्सिव व्याकरण भी स्वीकार किए जा सकते हैं।

3

मुझे पता है कि यह प्रश्न पुराना है, लेकिन उन लोगों के लिए अभी भी एक लेक्सर जनरेटर की तलाश में जो स्कैला कोड आउटपुट करता है, मैंने जावा के बजाए a fork of JFlex that emits Scala लिखा है, जिसमें संबंधित मैवेन और एसबीटी प्लगइन्स भी शामिल हैं। सभी अब मेवेन सेंट्रल पर उपलब्ध हैं।

हम वर्तमान में FACTORIE में प्राकृतिक भाषा प्रसंस्करण पाइपलाइन के हिस्से के रूप में अंग्रेजी पाठ को टोकन करने के लिए इसका उपयोग कर रहे हैं (उदाहरण के लिए। स्काला here युक्त फ़्लेक्स फ़ाइल।

+0

यह बढ़िया है। मैंने जेएफएक्स 1.5 + स्केल https://github.com/moy/JFlex/releases जारी किया था, लेकिन ऐसा लगता है कि यह अधिक अद्यतित है, साथ ही ढूंढना आसान है। –

+0

@JohnTangBoyland मेरी इच्छा है कि मुझे अपना लेखन लिखने से पहले आपका संस्करण मिल गया! –

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