P [Node] .rep生成P [String]而不是节点数组

时间:2015-11-17 23:17:57

标签: fastparse

我希望plusses的结果是某种数组

case class Plus()
val plus: P[Plus] = P ("+") map {_ => Plus()}
val plusses: P[List[Plus]] = P ( plus.rep.! )  // type mismatch; found: Parser[String]  required: Parser[List[Plus]]

但是编译器说

  

类型不匹配; found:Parser [String] required:Parser [List [Plus]]

2 个答案:

答案 0 :(得分:2)

答案

首先,您不需要使用.!捕获某些内容,因为您已在plus解析器中获得了结果。 .rep然后"创建"一个解析器,重复plus解析器0到n次,并将结果连接成Seq[Plus]

case class Plus()
val plus: P[Plus] = P ("+") map {_ ⇒ Plus()}
val plusses: P[Seq[Plus]] = P ( plus.rep )

其次,如果使用重复操作rep,则Parser返回Seq而不是List如果您确实需要列表,请使用map转换{{1} } Seq

List

答案 1 :(得分:0)

.!是“捕获解析器解析的输入字符串部分”(参见http://lihaoyi.github.io/fastparse/#Capture)。因此,.!的返回类型为String

我认为你想要的是:

val plusses: P[List[Plus]] = P ( plus.rep ) map (_.toList)

以下是您将获得的信息:

@ plusses.parse("+++")
res6: core.Result[List[Plus]] = Success(List(Plus(), Plus(), Plus()),3)