为什么Scala解析器组合器不会在重复(rep)子句中传播失败?

问题描述 投票:1回答:1

如果我有这样简单的解析器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(使用任何字符串),它会像我的“糟糕!”那样失败!信息。

现在,如果我添加这个:

  def repTerm: Parser[Unit] = rep(simpleTerm | intWhole) ^^ { _ => Unit }

如果我现在再次使用非数字字符串解析repTerm,我希望发生的事情就是让它失败并使用相同的“糟糕!”消息 - 基本上是一个中止的解析。相反的是,我完全没有错误;只是退回的单位。

有没有办法让解析在遇到失败时停止,并在rep()子句期间返回失败?

scala parser-combinators
1个回答
0
投票

看着代码。 rep()处理故障与错误的方式有所不同。 failure()只是告诉重复序列停止,即重复子句的结束。这不一定是破损。 err()表示某些内容已损坏,而rep()子句确实传播错误并停止进一步解析。

将上面代码中的failure()更改为err()会产生停止进一步解析的所需结果。

© www.soinside.com 2019 - 2024. All rights reserved.