2012-05-30 11 views
6

मुझे स्कैला पार्सर काम कर रहा है लेकिन समाधान उतना साफ नहीं है जितना मैं चाहूंगा। समस्या यह है कि कुछ प्रोडक्शंस को टोकन के हिस्से के रूप में व्हाइटस्पेस पर विचार करना चाहिए, लेकिन "उच्च स्तरीय" प्रोडक्शंस व्हाइटस्पेस को अनदेखा/छोड़ने में सक्षम होना चाहिए।स्कैला पार्सर जो कभी-कभी व्हाइटस्पेस छोड़ देता है और कभी-कभी

यदि मैं निचले स्तर के पार्सर्स को विस्तारित करने के विशिष्ट स्कैला पार्सर पैटर्न का उपयोग करता हूं तो स्किप व्हाइटस्पेस सेटिंग्स विरासत में होती है और चीजें बहुत जल्दी गन्दा हो जाती हैं।

मुझे लगता है कि मैं विस्तार दृष्टिकोण का उपयोग न करने से बेहतर होगा लेकिन उच्च स्तर के पार्सर्स वर्ग में उपलब्ध निम्न स्तर के पार्सर का एक उदाहरण है - लेकिन मुझे यकीन नहीं है कि यह काम कैसे करें, जैसे कि प्रत्येक उदाहरण इनपुट वर्णों की केवल एक धारा देखेंगे।

यहाँ सबसे कम स्तर के पार्सर का हिस्सा है -

class VulgarFractionParser extends RegexParsers { 
    override type Elem = Char 

override val whiteSpace = "".r 

तो मैं विस्तार कि

class NumberParser extends VulgarFractionParser with Positional { 

की तरह लेकिन इस बिंदु पर NumberParser स्पष्ट रूप से सिर्फ FractionParser तरह खाली स्थान के संभाल चाहिए। नंबरपर्सर के लिए यह अभी भी बहुत प्रबंधनीय है - लेकिन अगले स्तर पर मैं वास्तव में प्रस्तुतियों को परिभाषित करने में सक्षम होना चाहता हूं कि एक सामान्य रेगेक्स पार्सर की तरह एक विभाजक के रूप में व्हाइटस्पेस का उपयोग करें।

एक उदाहरण की तरह कुछ होगा:

IBM 33.33/ 1200.00 
or 
IBM 33.33/33.50 1200.00 

2 मूल्य कभी कभी दो भागों से अलग कर दिया गया है एक "/" और कभी कभी केवल स्लैश के बाद कुछ भी नहीं के साथ एक एकल हिस्सा है (या यहां तक ​​कि एक स्लेश युक्त नहीं बिलकुल)।

def bidOrAskPrice = ("$"?) ~> (bidOrAskPrice1 | bidOrAskPrice2 | bidOrAskPrice3) 

    def bidOrAskPrice1 = number ~ ("/".r) ~ number ~ (SPACES) ^^ { 
    case a ~ slash ~ b ~ sp1 => BidOrAsk(a,Some(b)) 
    } 
    def bidOrAskPrice2 = (number ~ "/" ~ (SPACES)) ^^ { case a ~ slash ~ sp => BidOrAsk(a,None) } 
    def bidOrAskPrice3 = (number ~ (SPACES?)) ^^ { case a ~ sp => BidOrAsk(a , None)} 
+0

क्या आप प्रस्तुतियों के कुछ उदाहरण दे सकते हैं जिन्हें व्हाइटस्पेस और प्रस्तुतियों के कुछ उदाहरणों पर विचार करना चाहिए जिन्हें व्हाइटस्पेस पर विचार नहीं करना चाहिए? – sarnold

+0

ने डेटा के उदाहरण और व्हाइटस्पेस संवेदनशील तत्वों में से एक के साथ प्रश्न अद्यतन किया। – malsmith

उत्तर

2

यह एक टोकन पार्सर में पहले पार्सर चालू करने के लिए (एक lexer, वास्तव में) और अधिक मतलब नहीं करता है, और है कि बजाय दूसरे पार्सर पढ़ने बनाने सादा Char?

+1

मैंने इस दृष्टिकोण का एक उदाहरण नहीं देखा है, लेकिन यह वही लगता है जो मैं चाहता हूं। – malsmith

3

एक समाधान हैंडल व्हाइटस्पेस फ़ंक्शन को ओवरराइड करना और अपनी विस्तारित कक्षा में एक var मान के साथ स्किपिंग व्हाइटस्पेस को सक्रिय करना है।

आप RegexParsers का कोड यहाँ देख सकते हैं: https://github.com/scala/scala/blob/v2.9.2/src/library/scala/util/parsing/combinator/RegexParsers.scala

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