P[Node].rep 生成 P[String] 而不是节点数组
P[Node].rep produces P[String] rather than array of nodes
我希望 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]]
但是编译器说
type mismatch; found : Parser[String] required: Parser[List[Plus]]
.!
是 "to capture the section of the input string the parser parsed"(参见 http://lihaoyi.github.io/fastparse/#Capture)。所以 .!
的 return 类型是 String
.
我想你想要的是:
val plusses: P[List[Plus]] = P ( plus.rep ) map (_.toList)
以下是您将获得的内容:
@ plusses.parse("+++")
res6: core.Result[List[Plus]] = Success(List(Plus(), Plus(), Plus()),3)
回答
首先,您不需要使用 .!
捕获某些内容,因为您在 plus
解析器中已经有了结果。 .rep
然后是 "creates" 一个解析器,它重复 plus
解析器 0 到 n 次并将结果连接成 Seq[Plus]
.
case class Plus()
val plus: P[Plus] = P ("+") map {_ ⇒ Plus()}
val plusses: P[Seq[Plus]] = P ( plus.rep )
其次,如果使用repeat操作rep
,Parser
s return Seq
而不是List
如果你真的需要一个列表,使用map将 Seq
转换为 List
.
val plussesAsList: P[List[Plus]] = P( plus.rep ).map( seq ⇒ seq.toList)
我希望 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]]
但是编译器说
type mismatch; found : Parser[String] required: Parser[List[Plus]]
.!
是 "to capture the section of the input string the parser parsed"(参见 http://lihaoyi.github.io/fastparse/#Capture)。所以 .!
的 return 类型是 String
.
我想你想要的是:
val plusses: P[List[Plus]] = P ( plus.rep ) map (_.toList)
以下是您将获得的内容:
@ plusses.parse("+++")
res6: core.Result[List[Plus]] = Success(List(Plus(), Plus(), Plus()),3)
回答
首先,您不需要使用 .!
捕获某些内容,因为您在 plus
解析器中已经有了结果。 .rep
然后是 "creates" 一个解析器,它重复 plus
解析器 0 到 n 次并将结果连接成 Seq[Plus]
.
case class Plus()
val plus: P[Plus] = P ("+") map {_ ⇒ Plus()}
val plusses: P[Seq[Plus]] = P ( plus.rep )
其次,如果使用repeat操作rep
,Parser
s return Seq
而不是List
如果你真的需要一个列表,使用map将 Seq
转换为 List
.
val plussesAsList: P[List[Plus]] = P( plus.rep ).map( seq ⇒ seq.toList)