私はすでに関数型プログラミングに慣れてきました。私は Haskell と PLT スキームに精通しています (熟練していませんが)。私は PLT スキームを使用して、玩具言語 (PLAI を参照) 用の小さなインタープリターを作成しました。命令型言語の方が得意です。
Prolog で選択したおもちゃの言語の小さなインタープリターを構築するために使用できるリソースを誰か教えてもらえますか?
私はすでに関数型プログラミングに慣れてきました。私は Haskell と PLT スキームに精通しています (熟練していませんが)。私は PLT スキームを使用して、玩具言語 (PLAI を参照) 用の小さなインタープリターを作成しました。命令型言語の方が得意です。
Prolog で選択したおもちゃの言語の小さなインタープリターを構築するために使用できるリソースを誰か教えてもらえますか?
私は主にswi-prologを使用しているので、私が言うことのほとんどはswi-prologに関連しています。ただし、他のプロローグ実装は、同様の述語/ライブラリ(おそらく少し異なる名前)を持っている可能性があるため、それらのマニュアルを検索して見つけることができます。また、私はプロローグでインタプリタではなくコンパイラを書いているので、おそらくいくつかの部分はそれほどインタプリタに関連していません。
SWI-Prologのドキュメンテーションサイトは、ものを見つけるのに本当に適しています。検索ボックスを使用して、述語を検索するか、一般的な検索を実行します。たくさんのライブラリがありますが、経験を積むために自分でいくつかのものを実装したいかもしれません。あなたは車輪の再発明をすることになるかもしれませんが、それは役に立つでしょう。
本「TheArtofProlog」(Sterling、Shapiro)には、プロローグでコンパイラーを構築することに専念する章があります(そしてそれはプロローグにとっても素晴らしい本です)。
たぶん、prolog用のlex/bisonと同等のツールがいくつかあります。私は本当に検索したことはありません。
イムホ、レクサーは単純なプロローグでは非常に簡単です。当然、パターンマッチングに大きく依存します。
パーサーについては、DCGを使用することをお勧めします:明確な句の文法:swi-prolog doc、詳細についてはgoogle。
問題は、ファイル全体を解析する必要があることです(または、少なくとも私はそれを行う方法を見つけていません)。ところで、レクサーはDCGでも実行できますが、実際には優れているとは思いません。
中間コードを選択した場合、パーサーから抽象構文ツリーを簡単に作成できます(解析中に多くのものを評価することもできます)。
セマンティックチェックについて:おもちゃの言語用のコンパイラでは、解析中にほとんどのセマンティックチェック(スコープ関連の関数呼び出し)を実行し、残りは別のステップで実行します。少し面倒です
その他の便利なもの:assert / 1、グローバル変数、メタ述語(maplist / [2-6])を確認してください。
純粋なプロローグではなく、それらを悪用することによってコードを過度に必須にする可能性があります(そして、いくつかの本当に厄介な副作用が発生する可能性があります)
シンボルテーブル(必要な場合)の場合、assert / 1を使用して述語を追加できます。swi-prologは、動的述語に動的ハッシュテーブルを使用します。警告:動的述語は静的述語よりも遅いため、テーブルを完成させて変更を加えない場合は、compile_predicates/1を使用して静的述語を作成してください。たとえば、STの解析が終了すると、STの準備ができたので、コンパイルします。STの別の解決策は、関連付けリストを使用することです。それらはAVLツリーで実装されているため、コストはO(log(N))です。
Markus Triska (彼のホームページ)は、あなたにとって興味深いものをいくつか示しています: たとえば、おもちゃの LISPや、メタ インタープリターへのいくつかのヒントです。