首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析器组合器处理与可选解析器的交替

解析器组合器处理与可选解析器的交替
EN

Stack Overflow用户
提问于 2021-01-28 04:19:09
回答 1查看 44关注 0票数 0

我有一个Parser[OptionX]类型的解析器p和另一个ParserY类型的Q。(X和Y是具体的类型,但这在这里并不重要)。

我希望以这样的方式组合它们,使结果解析器返回一个Parser[EitherX,Y]。如果p产生一些(X),这个解析器将用左(X)成功,否则,如果q产生y,它将与右(Y)一起成功。否则,它将失败。输入将在成功案例中使用,而在不成功案例中则不会使用。

我很感激在这方面的任何帮助,因为我无法完全弄清楚如何使它发挥作用。

EN

回答 1

Stack Overflow用户

发布于 2021-01-28 06:03:22

休息后再坚持一点,我就能解决这个问题了。我不认为我的解决方案是最优雅的,并希望得到反馈:

代码语言:javascript
复制
def compose[X, Y](p: Parser[Option[X]], q: Parser[Y]): Parser[Either[X, Y]] = Parser {
  in =>
    p(in) match {
      case s@this.Success(Some(_), _) => s map (xo => Left(xo.get))
      case _ => q(in) match {
        case s@this.Success(_, _) => s map (x => Right(x))
        case _ => this.Failure("combine: failed", in)
      }
    }
}

implicit class ParserOps[X](p: Parser[Option[X]]) {
  def ?|[Y](q: => Parser[Y]): Parser[Either[X, Y]] = compose(p, q)
}

// Example of usage
def anadicTerm: Parser[AnadicTerm] = (maybeNumber ?| anadicOperator) ^^ {
  case Left(x: Number) => debug("anadicTerm (Number)", AnadicTerm(Right(x)))
  case Right(x: String) => debug("anadicTerm (String)", AnadicTerm(Left(x)))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65930980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档