1

Extractor[A]Extractor が実行されたときに A が抽出される型を定義する外部 DSL (Combinator-Parsers) があります。

エクストラクタは、次のステップを継続として呼び出すステップで構成されます。Aエクストラクタは中間抽出 (文字列ベースのキーと値のペア) を作成し、最終的にファクトリによって適切な に変換されます。

抽出器: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)
    }
  }

EDIT : ステップパーサーには署名がありますval step: Parser[Step[_]](ステップパーサーは、そのタイプが正確に解析されていることを知ることができませんStep[A]。最後に、ステップはA抽出パーサーによって適切なタイプを取得しますasInstanceOf)

上記のエクストラクタ パーサーは現在、 extractorType のエクストラクタのみを解析でき"SUBTITLES"ます。他のextractorTypesを連続して追加したいcase "REVIEWS" => ....

各 extractor に対して、タイプ(eg ) のものを作成し、一致するs を extractor に渡すExtractor[A]特殊なファクトリ (eg ) を提供する必要があります(それが の目的です)。new SubtitleFactoryAMovieInfos.SubtitlestepasInstanceOf

パーサーはさまざまな Extractor-Types (字幕、画像、Audiotracks など) を解析するParser[Extractor[_]]必要があるため、 を使用します。

step.asInstanceOf[Step[MovieInfos.Subtitle]]さらに、すでに適切なタイプを提供しているので、少し怪しいものは避けたいExtractor[MovieInfos.Subtitle]

そして最後に、何らかの構成/フックによって拡張可能な、より柔軟な Factory が必要です。

任意の推奨事項をいただければ幸いです。

4

0 に答える 0