scala fastparse typechecking

时间:2017-06-07 00:38:28

标签: scala fastparse

我很困惑为什么以下使用scala fastparse 0.4.3的代码无法进行类型检查。

val White = WhitespaceApi.Wrapper{
  import fastparse.all._
  NoTrace(CharIn(" \t\n").rep)
}
import fastparse.noApi._
import White._

case class Term(tokens: Seq[String])
case class Terms(terms: Seq[Term])

val token = P[String] ( CharIn('a' to 'z', 'A' to 'Z', '0' to '9').rep(min=1).!)
val term: P[Term] = P("[" ~ token.!.rep(sep=" ", min=1) ~ "]").map(x => Term(x))
val terms = P("(" ~ term.!.rep(sep=" ", min=1) ~ ")").map{x => Terms(x)}
val parse = terms.parse("([ab bd ef] [xy wa dd] [jk mn op])")

错误消息:

[error] .../MyParser.scala: type mismatch;
[error]  found   : Seq[String]
[error]  required: Seq[Term]
[error]     val terms = P("(" ~ term.!.rep(sep=" ", min=1) ~")").map{x => Terms(x)}
[error]                                                                         ^

我认为,由于term的类型为Term,并且terms模式使用term.!.rep(...,因此它应该为Seq[Term]

1 个答案:

答案 0 :(得分:2)

我明白了。我的错误是在!中冗余地捕获(terms}。应该写下这一行:

val terms = P("(" ~ term.rep(sep=" ", min=1) ~ ")").map{x => Terms(x)}

请注意,term.!.rep(已被重写为term.rep(。 显然,在任何规则中捕获将返回捕获的子规则匹配的文本,覆盖子规则实际返回的内容。我猜这是正确使用时的一个功能。 :)