scala fastparse 类型检查
scala fastparse typechecking
我很困惑为什么以下使用 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]
。
我明白了。我的错误是在 terms
中冗余捕获(使用 !
)。该行应该改为:
val terms = P("(" ~ term.rep(sep=" ", min=1) ~ ")").map{x => Terms(x)}
请注意 term.!.rep(
已被重写为 term.rep(
。
显然,在任何规则中捕获都会 return 捕获的子规则匹配的文本覆盖子规则实际 return 的内容。我想这是正确使用时的一项功能。 :)
我很困惑为什么以下使用 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]
。
我明白了。我的错误是在 terms
中冗余捕获(使用 !
)。该行应该改为:
val terms = P("(" ~ term.rep(sep=" ", min=1) ~ ")").map{x => Terms(x)}
请注意 term.!.rep(
已被重写为 term.rep(
。
显然,在任何规则中捕获都会 return 捕获的子规则匹配的文本覆盖子规则实际 return 的内容。我想这是正确使用时的一项功能。 :)