मान लीजिए कि मैं स्कैला में एक प्राथमिक एसक्यूएल पार्सर लिख रहा हूं। कैसे मैं ~ tokens
में rep(token)
की वजह से पूरे वाक्यांश ऊपर gobbling से selectclause रोकूँस्कैला रेगेक्सपार्स में गैर-लालची मिलान
class Arith extends RegexParsers {
def selectstatement: Parser[Any] = selectclause ~ fromclause
def selectclause: Parser[Any] = "(?i)SELECT".r ~ tokens
def fromclause: Parser[Any] = "(?i)FROM".r ~ tokens
def tokens: Parser[Any] = rep(token) //how to make this non-greedy?
def token: Parser[Any] = "(\\s*)\\w+(\\s*)".r
}
जब SELECT foo FROM bar
के खिलाफ selectstatement मिलान करने के लिए कोशिश कर रहा है, मैं निम्नलिखित है?
दूसरे शब्दों में, मैं स्कैला में गैर-लालची मिलान कैसे निर्दिष्ट करूं?
स्पष्टीकरण के लिए, मुझे पूरी तरह से पता है कि मैं स्ट्रिंग पैटर्न के भीतर मानक गैर-लालची वाक्यविन्यास (*?) या (+?) का उपयोग कर सकता हूं, लेकिन मुझे आश्चर्य हुआ कि उच्च स्तर पर इसे निर्दिष्ट करने का कोई तरीका है या नहीं डीफ टोकन के अंदर। उदाहरण के लिए, अगर मैं इस तरह टोकन परिभाषित किया था:
def token: Parser[Any] = stringliteral | numericliteral | columnname
फिर मैं कैसे प्रतिनिधि (टोकन) डीईएफ़ टोकन के अंदर के लिए गैर लालची मिलान निर्दिष्ट कर सकते हैं?
ऐसा लगता है जैसे हम [पेग की सुविधा के साथ] (https://en.wikipedia.org/wiki/Parsing_expression_grammar#Operational_interpretation_of_parsing_expressions) यहाँ काम कर रहे हैं: जबकि नियमित अभिव्यक्ति matchers लालच से मिलान करते हुए शुरू हो सकता है, लेकिन फिर पीछे होगा और यदि वे असफल होते हैं तो छोटे मिलानों का प्रयास करें और सीएफजी हर संभावना की कोशिश करता है, पीईजी का '*', '+', और '? 'ऑपरेटर हमेशा लालच से व्यवहार करते हैं, जितना संभव हो उतना इनपुट लेते हैं और कभी पीछे नहीं हटते: अभिव्यक्ति' ए * 'हमेशा उपभोग करेगा कई इनपुट इनपुट स्ट्रिंग में लगातार उपलब्ध हैं, जिससे '(ए * ए)' हमेशा असफल हो जाता है। –