C のような言語用のパーサーを作成したいと考えています。興味深い点は、ソースにアクセスできる人が簡単に変更して言語 (インスタンスの新しい式タイプ) を拡張し、実行時に構成可能な拡張機能を使用できるようにビルドしたいということです (それらはオンとオフを切り替えます)。
私の現在の意図は、再帰的なまともなパーサーをオブジェクトとして構築することです。各プロダクションはオブジェクトのメソッドになります。拡張の方法は、必要に応じてメソッド (およびプロダクション定義) を置き換えるこのベースからクラスを派生させることです。私はまだ拡張機能を組み合わせて一致させる方法を理解しようとしています. 1 つのアイデアは、v-tbl でゲームをプレイすることです。オブジェクトは、ベースのコピーである v-tbl で構築されますが、メソッドは派生クラスから置き換えられます。
ソリューションのビットいじりの性質を除けば、私が抱えている唯一の問題は
- v-tbl mixup を行う合理的な方法
- 2 つの拡張機能が同じプロダクションを変更した場合の対処方法 (ほとんどの置換では、1 つの置換呼び出しを持つオリジナルを呼び出すことになるため、もう 1 つの置換呼び出しは機能しますが、これを設定するメカニズムが問題です)
- 拡張機能の拡張を許可する方法 (これは最終的に標準の MI システムのように見えるかもしれませんが、どのように機能するかはわかりません)
別の解決策 (同じアプローチのもう少し平凡なバージョン) は、静的メンバー変数を使用して関数ポインターを格納し、同じ効果のためにそれらを呼び出すことです。
編集: BNF 定義からプロダクションを構築できるシステムを既に構築しています。私が決定したことをサポートするように変更できます。