/ / Scalaパーサーコンビネータコードを構造化する適切な方法は何ですか? - 解析、スケーラ、コーディングスタイル、フォーマット

Scalaパーサーコンビネータコードを構造化する適切な方法は何ですか? - 解析、スケーラ、コーディングスタイル、フォーマット

Scala Parsersライブラリでは、最後にParserの実装を残すParserをサブクラス化すると、最初はParserをサブクラス化したクラスのスコープ内にある場合を除いて、複数のクラスまたはオブジェクトに分割することはできないようです。これに対処する適切な方法、私はちょうど連続して50の怠け者の弁を持っている必要はありません?

回答:

回答№1は2

個人的には、それを行う方法は、すべてを1つのクラスに入れておくこと、または意味があれば、コンセプトを拡張する単一の継承階層を作ることだと思います。 JavaTokenParsers 拡張する RegexParsers これは Parsers。また、トークン化されたパーサの使用は、文法から字句を分けることによって少し助けます。

それ以外は、1か所に保管してください: 文法を分割することは、理解の悪夢になります。 ASTクラスとそのクラスで動作するコードはすべてパーサに保持する必要はありません。

今、それが本当にあなたのテストに合っていなければ、あなたはそれらを形質で分割し、自己型を使用して形質間の必要な依存関係を作成します。あなたはただ一つの大きなクラス(またはオブジェクト)を作り、すべての特性から継承します。


回答№2の場合は1

さまざまなコンポーネントを trait同じ親を拡張する Parser タイプし、それらを一緒にミックスしてあなたの最終的なパーサー。明らかに、パーサー結合子のいくつかは他のパーサーに依存するが、少なくとも基本パーサ(例えば、端末パーサ)はこのように因数分解することができる。とにかくそれがそうでなければ、コードがあまりにも多くの異なるファイルに分割されている場合、パーサが何をしているかを分析するのが非常に困難になる可能性があります。