1

我有一个外部 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]

最后,我想要一个更灵活的工厂,可以通过某种配置/挂钩进行扩展。

任何建议表示赞赏,谢谢。

4

0 回答 0