Scala Parsersライブラリでは、Parsersをサブクラス化する必要があるため、最終的には特定のParser実装が残ります。そのため、クラスのスコープ内にない限り、複数のクラスまたはオブジェクトに実際に分離することはできないようです。元々サブクラス化されたパーサー。これに対処する適切な方法は何ですか。そうすれば、50個の怠惰なvalを続けて持つ必要がなくなります。
2 に答える
個人的には、それを行う方法は、すべてを1つのクラスに保持するか、意味がある場合は、 extends with extendsJavaTokenParsers
のように、単一の継承階層を作成して概念を拡張することだと思います。また、トークン化されたパーサーを使用すると、文法から字句を分割することで、少し役立ちます。RegexParsers
Parsers
それ以外は、1つの場所に保管してください。文法を分割すると、理解の悪夢になります。残りのすべて(ASTクラス、およびそれらを操作するコード)は、パーサーで保持する必要はありません。
さて、それが本当にあなたのテストに当てはまらない場合は、それらをトレイトに分割し、セルフタイプを使用してトレイト間に必要な依存関係を作成することができます。あなたは、すべての特性から継承する1つの大きなクラス(またはオブジェクト)を作成するだけです。
trait
さまざまなコンポーネントを同じ親タイプを拡張するsに分割し、Parser
それらを組み合わせて最終的なパーサーを作成できます。明らかに、一部のパーサーコンビネーターは他のコンビネーターに依存しますが、少なくとも基本的なパーサー(ターミナルパーサーなど)はこの方法で除外できます。とにかく、それをあまりにも多くの異なるクラス/特性に分割したくないでしょう。そうしないと、コードがあまりにも多くの異なるファイルに分割された場合、パーサーが何をしているかを分析するのが非常に難しくなる可能性があります。