val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
यह रिकर्सिव पार्सर इनपुट के अंत तक "(? Ui) (regexvalue)" आर को पार्स करने का प्रयास करेगा। स्कैला में पार्सिंग को प्रतिबंधित करने का एक तरीका है जब कुछ परिभाषित संख्याओं को "अनिच्छुक" द्वारा खपत किया जाता है?स्केल में रिकर्सिव पार्सर का उन्नत नियंत्रण
युपीडी: मैं एक गरीब समाधान है:
object NonRecursiveParser extends RegexParsers with PackratParsers{
var max = -1
val maxInput2Consume = 25
def uninteresting:Regex ={
if(max<maxInput2Consume){
max+=1
("."+"{0,"+max.toString+"}").r
}else{
throw new Exception("I am tired")
}
}
lazy val value = "itt".r
def parser:Parser[Any] = (uninteresting~>value)|parser
def parseQuery(input:String) = {
try{
parse(parser, input)
}catch{
case e:Exception =>
}
}
}
नुकसान:
- नहीं सभी सदस्यों आलसी Vals हैं तो PackratParser कुछ समय होगा जुर्माना
- हर "नीरस" विधि कॉल पर regexps निर्माण - समय जुर्माना
- प्रोग्राम को नियंत्रित करने के लिए अपवाद का उपयोग - कोड शैली और समय जुर्माना
आप इस समस्या को अन्य पार्सर पुस्तकालयों, जेनरेटर या ढांचे के साथ कैसे हल करेंगे? –
आप वास्तव में क्या करने की कोशिश कर रहे हैं? –