如果我有这样简单的解析器defs:
def term: Parser[String] = """[a-zA-Z"']+""".r ^^ { _.toString }
def intWhole: Parser[String] = wholeNumber ^^ { w => w }
def simpleTerm: Parser[String] = term >> {
case t:String => failure("Oops!")
}
如果我对simpleTerm(使用任何字符串)进行解析,它会因为我的" Oops而失败!"消息。
现在,如果我添加这个:
def repTerm: Parser[Unit] = rep(simpleTerm | intWhole) ^^ { _ => Unit }
如果我现在再次使用非数字字符串解析repTerm,那么我希望发生的事情就是让它失败并使用相同的"糟糕!"消息 - 基本上是一个中止的解析。相反的是,我完全没有错误;只是返回的单位。
有没有办法让解析在遇到失败时停止,并在rep()子句期间返回失败?
答案 0 :(得分:0)
看着代码。 rep()处理故障与错误的方式有所不同。 failure()只是告诉重复序列停止,即重复子句的结束。它不一定是破损。 err()表示存在缺陷,而rep()子句确实传播错误并停止进一步解析。
将上面代码中的失败()更改为err()会产生停止进一步解析的所需结果。