2015-03-27 5 views
43

पर ध्यान नहीं देता मैं एक पार्सर कि स्काला के RegexParsers का उपयोग कर लिखा गया था है - linkस्काला PackratParser विफलता पार्सर

यह था कुछ गंभीर प्रदर्शन समस्याओं जब एक व्याकरण जो गहराई से नेस्टेड भाव था पार्स करने। इस तरह मैंने एक संस्करण बनाया है जहां मैं स्कैला के PackratParsers - link

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

सही ढंग से 'अमान्य नियम' विफलता रिपोर्ट करने के लिए प्रयोग किया जाता है पुराने (गैर packrat) पार्सर, यहाँ विफलता पार्सर Combinator | failure("Invalid rule") के माध्यम से - link

packrat-पार्सर संस्करण का उपयोग कर रहे हैं, अगर मैं सक्षम ट्रेसिंग मैं इस ट्रेस से देख सकता हूं कि विफलता केवल गैर-पैट्रैट संस्करण में बनाई गई है, हालांकि पैकट्रैसर इसे अनदेखा कर रहा है और इसके बजाय हमेशा failure: Base Failure लौटाता है।

क्या पैट्रैटपार्सर्स का उपयोग करते समय विफलता हैंडलिंग के बारे में कुछ अलग है जिसे मुझे समझने की आवश्यकता है?

उत्तर

1

ऐसा लगता है कि आपकोके बजाय err("Invalid rule") का उपयोग करने की आवश्यकता है, क्योंकि यह गारंटी देता है कि कोई बैकट्रैकिंग नहीं की जाएगी।

+0

यदि मैं विफलता ("अमान्य नियम") के बजाय 'त्रुटि (" अमान्य नियम ") का उपयोग करता हूं, तो बैकट्रैकिंग बंद हो गई है, मेरे कई अन्य नियम जो पहले मान्य थे, 'त्रुटि' ('अवैध नियम") 'जो सही नहीं है। – adamretter