我有一个Parser[OptionX]类型的解析器p和另一个ParserY类型的Q。(X和Y是具体的类型,但这在这里并不重要)。
我希望以这样的方式组合它们,使结果解析器返回一个Parser[EitherX,Y]。如果p产生一些(X),这个解析器将用左(X)成功,否则,如果q产生y,它将与右(Y)一起成功。否则,它将失败。输入将在成功案例中使用,而在不成功案例中则不会使用。
我很感激在这方面的任何帮助,因为我无法完全弄清楚如何使它发挥作用。
发布于 2021-01-28 06:03:22
休息后再坚持一点,我就能解决这个问题了。我不认为我的解决方案是最优雅的,并希望得到反馈:
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)))
}https://stackoverflow.com/questions/65930980
复制相似问题