val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
此递归解析器将尝试解析 "(?ui)(regexvalue)".r 直到输入结束。当某些定义数量的字符被“无趣的东西”消耗时,scala 是否有一种禁止解析的方法?
UPD:我有一个糟糕的解决方案:
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 将有一些时间损失
- 在每个“无趣”的方法调用上构造正则表达式 - 时间损失
- 使用异常来控制程序 - 代码风格和时间损失