1

C のような言語用のパーサーを作成したいと考えています。興味深い点は、ソースにアクセスできる人が簡単に変更して言語 (インスタンスの新しい式タイプ) を拡張し、実行時に構成可能な拡張機能を使用できるようにビルドしたいということです (それらはオンとオフを切り替えます)。

私の現在の意図は、再帰的なまともなパーサーをオブジェクトとして構築することです。各プロダクションはオブジェクトのメソッドになります。拡張の方法は、必要に応じてメソッド (およびプロダクション定義) を置き換えるこのベースからクラスを派生させることです。私はまだ拡張機能を組み合わせて一致させる方法を理解しようとしています. 1 つのアイデアは、v-tbl でゲームをプレイすることです。オブジェクトは、ベースのコピーである v-tbl で構築されますが、メソッドは派生クラスから置き換えられます。

ソリューションのビットいじりの性質を除けば、私が抱えている唯一の問題は

  • v-tbl mixup を行う合理的な方法
  • 2 つの拡張機能が同じプロダクションを変更した場合の対処方法 (ほとんどの置換では、1 つの置換呼び出しを持つオリジナルを呼び出すことになるため、もう 1 つの置換呼び出しは機能しますが、これを設定するメカニズムが問題です)
  • 拡張機能の拡張を許可する方法 (これは最終的に標準の MI システムのように見えるかもしれませんが、どのように機能するかはわかりません)

別の解決策 (同じアプローチのもう少し平凡なバージョン) は、静的メンバー変数を使用して関数ポインターを格納し、同じ効果のためにそれらを呼び出すことです。

編集: BNF 定義からプロダクションを構築できるシステムを既に構築しています。私が決定したことをサポートするように変更できます。

4

5 に答える 5

1

これらは、Perl 6 の設計作業が直面した課題の一部です。彼らが思いついた解決策のいくつかを調べる価値があるかもしれません. または、それが非常にやり過ぎであることに気付くかもしれません。

于 2008-10-24T05:58:38.580 に答える
1

少し前に http://code.google.com/p/compparser/にアップロードした構成可能なパーサーを作成しました 。プロジェクトは最新ではありませんが、正常に動作しています。

于 2010-02-01T09:08:42.257 に答える
0

もう1つのオプションは、コードではなくXMLなどで解析ルールを表現することです。効率は低下しますが、はるかに動的に構成可能です。各言語またはバリアントは、独自の(XML)ファイルを使用するだけでなく、他のファイルを「ベース」ファイルとしてインクルード/参照することもできます。

于 2008-10-24T06:51:49.487 に答える
0

率直に言って、私はあなたが書いたすべてを理解したかどうかさえ確信が持てません... :-)

しかし、パーサー柔軟性を見ると、 Lua の LPeg-Parsing Expression Grammars について考えます。あなたのニーズに合わないかもしれませんが、一見の価値があります... ;-)

于 2008-10-24T09:56:14.483 に答える
0

大学のコースを正しく思い出せば、再帰的降下パーサーには、特に拡張を許可しているため、いくつかの制限があります。他の誰かの言語拡張が問題を引き起こす可能性があります。

適切なコンパイラ ツールキット (オープン ソースのANTLRなど) を使用すると、作業が容易になるだけでなく、いくつかの異なるアプローチが提供される場合もあります。

于 2008-10-24T06:05:31.390 に答える