私はscalaでおもちゃのコンパイラを書いているところです。ターゲット言語自体はscalaのように見えますが、実験のためのオープンフィールドです。
いくつかの大規模なリファクタリングの後、抽象構文木をモデル化するための良い方法を見つけることができません。Scalaのパターンマッチングの機能を使用したいのですが、問題は、ツリーがコンパイルプロセスに沿って移動する情報(タイプ、シンボルなど)を運ぶことです。
私はいくつかの解決策を見ることができますが、どれも好きではありません:
可変フィールドを持つケースクラス(scalaコンパイラがこれを行うと思います):問題は、これらのフィールドがコンパイルの各段階に存在しないため、null(またはOption)する必要があり、デバッグが非常に重くなることです。コードを書く。さらに、たとえば、タイピングフェーズの後にnullタイプのノードを見つけた場合、バグの原因を見つけるのに非常に苦労します。
巨大な特性/ケースクラス階層:Node、NodeWithSymbol、NodeWithTypeなどのようなもの...記述して操作するのは面倒なようです
抽出器で完全に手作りされたもの
また、完全に不変のASTを使用するのが適切かどうかもわかりません。特に、暗黙的な共有がなく(コンパイラが不変性を認識していないため)、ツリーを常にコピーするパフォーマンスが低下する可能性があるscalaではそうです。 。
Scalaの強力な型システムを使用して私のツリーをモデル化するためのエレガントなパターンを思いつくことができますか?