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
यदि आवश्यक है।