这是我想做的事情:

def parser = parser_a >> {
  case a => val c = compute(a) ; parser_b(c)
} ^^ {
  case a ~ b => (a, b)
}

当然,这是行不通的,因为^^运算符之后的函数仅获得parser_b的结果。如何保留parser_a的结果?

最佳答案

您可以使用解析器是单原子的事实来编写此代码,如下所示:

val parser = for {
  a <- parser_a
  b <- parser_b(compute(a))
} yield (a, b)

或者,您可以在解决方案中更改以下行(请注意,此处的success只是一般monadic return的不太具体的版本)。
  case a => val c = compute(a) ; success(a) ~ parser_b(c)

不过,在这种情况下,我个人发现for -comprehension更加清晰。

关于parsing - Scala解析器组合器:与 “into”结合使用时如何返回中间解析器的内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18827731/

10-12 22:55