val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
この再帰パーサーは、入力の最後まで "(?ui)(regexvalue)".r を解析しようとします。定義された数の文字が「uninterestingthings」によって消費されたときに解析を禁止する方法はscalaにありますか?
UPD:私は1つの悪い解決策を持っています:
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 =>
}
}
}
欠点:
- すべてのメンバーが遅延 val であるとは限らないため、PackratParser には時間のペナルティがあり
ます
。