我有一个外部 DSL(Combinator-Parsers)来定义Extractor[A]
A 是在执行 Extractor 时提取的类型。
提取器由将下一步称为延续的步骤组成。提取器创建中间提取(基于字符串的键/值对),最终A
由工厂转换为正确的 s。
提取器:case class Extractor[A](id: String, start: Step[A], factory: Factory[A])
步:sealed trait Step[A] {
def process(ctx: Context[A]): List[A]
}
工厂:trait Factory[A] { def create(extracts: List[(String,String)]): List[A] }
目前我的提取器解析器如下所示:
val extractor: Parser[Extractor[_]] = trace ~ "EXTRACT" ~ extractorType ~ extractorId ~ step ^^ {
case t ~ _ ~ ty ~ id ~ step => {
val extr = ty match {
case "SUBTITLES" => {
Extractor[MovieInfos.Subtitle](id, step.asInstanceOf[Step[MovieInfos.Subtitle]], new SubtitleFactory)
}
case x => throw new InvalidExtractorType(x)
}
extr.trace(t)
}
}
编辑: step-parser 有签名val step: Parser[Step[_]]
(step-parser 无法知道它的类型Step[A]
是完全解析的。最后,step A
-parser 通过提取器解析器获得它的正确类型asInstanceOf
)
上面的提取器解析器目前只能解析 extractorType 的提取器"SUBTITLES"
。我想连续添加其他extractorTypes,例如case "REVIEWS" => ...
。
对于每个提取器Extractor[A]
,我必须提供一个专门的工厂(例如new SubtitleFactory
)来创建类型A
(例如MovieInfos.Subtitle
)的东西并将匹配step
的 s 传递给提取器(这就是它的asInstanceOf
用途)。
解析器必须解析不同的提取器类型(字幕、图像、音轨等),所以我使用Parser[Extractor[_]]
,这是正确输入还是有更好的方法?
此外,我想避免step.asInstanceOf[Step[MovieInfos.Subtitle]]
看起来有点可疑,因为我已经提供了正确的类型Extractor[MovieInfos.Subtitle]
最后,我想要一个更灵活的工厂,可以通过某种配置/挂钩进行扩展。
任何建议表示赞赏,谢谢。