我希望加号的结果是某种数组
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]]
但编译器说
类型不匹配; 发现:需要解析器 [字符串]:解析器 [列表 [加]]
我希望加号的结果是某种数组
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]]
但编译器说
类型不匹配; 发现:需要解析器 [字符串]:解析器 [列表 [加]]
首先,您不需要捕获某些内容,.!
因为您已经在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 )
二、如果使用repeat操作rep
,Parser
s return Seq
and notList
如果确实需要list,使用map转换Seq
为List
。
val plussesAsList: P[List[Plus]] = P( plus.rep ).map( seq ⇒ seq.toList)
.!
是“捕获解析器解析的输入字符串的部分”(参见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)