/ / अंतर्निहित रूपांतरण के साथ अंतर्निहित वर्ग के साथ स्कैला - स्कैला, पार्सिंग, playframework-2.0, निहित

अंतर्निहित रूपांतरण के साथ स्काला अंतर्निहित रूपांतरण के साथ - स्कैला, पार्सिंग, playframework-2.0, निहित

RegexParsers के आधार पर गैर-बैकट्रैकिंग ~> और <~ मेरे पार्सर में जोड़ने का प्रयास करें।

RegexParsers लागू implicit def literal(s: String): Parser[String] चुड़ैल ट्रांसफॉर्म निस्संदेह एक पार्सर के लिए एक स्ट्रिंग [स्ट्रिंग]

अब मैं जोड़ता हूं:

`object implicits{

implicit class helper[T](parser  : Parser[T])  {
def ~>! [U](q: => Parser[U]): Parser[U] = parser ~! q ^^ {case a ~ b => b} named ("~>!")
def <~! [U](q: => Parser[U]): Parser[T] = parser ~! q ^^ {case a ~ b => a} named ("<~!")
}
}

चुड़ैल मेरी निहित कक्षा है।

लेकिन मैंने एक अजीब चीज देखी

def groupe : Parser[Group] =  "group(" ~>! identifier <~!  ")"

पहचानकर्ता एक पार्सर है

कक्षा पैरामीटर में स्ट्रिंग पास होने पर मुझे एक त्रुटि मिली "group(" ~>! identifier क्योंकि निहित नहीं किया गया है और संकलक ~> के लिए देखो! स्ट्रिंग के अंदर।

लेकिन जब यह विधि पैरामीटर में पारित किया गया है identifier <~! ")" स्ट्रिंग-> पार्सर [स्ट्रिंग] निहित काम।

क्या यह एक स्कैला बग है या मुझे कुछ याद आती है?

उत्तर:

उत्तर № 1 के लिए 1

यह एक बग नहीं है। समस्या यह है कि हल करने के लिए ~>! पर String कंपाइलर को दो अंतर्निहित रूपांतरणों को श्रृंखलाबद्ध करना होगा: से String सेवा मेरे Parser और यहां ये Parser सेवा मेरे helper, जिसे अनुमति नहीं है। इसलिए आपको से सीधे रूपांतरण जोड़ने की आवश्यकता है String सेवा मेरे helper:

implicit def stringToHelper(s: String): helper[String] = new helper(literal(s))

और से भी Regex सेवा मेरे helper यदि आवश्यक है।