2011-11-04 8 views
7

私はすでに機能プログラミングに慣れてきました。私は、HaskellとPLT Schemeには慣れ親しんでいます(しかし、堪能ではありません)。私はPLT Schemeを使用して、おもちゃの言語用の通訳をほとんど作っていません(PLAIを参照しています)。プロローグベースのインタプリタ

私はPrologで私が選んだおもちゃの言語の小さな通訳を作るために使うことができるリソースに誰かを案内できますか?

+0

いくつかのバイトコードでランタイムを実装する言語を作成しますか、いくつかのメタインタープリタのアプローチを目指しますか? –

+0

@Countably Infinite、私はmetainterpreterのアプローチに行きました。あなたが言及した選択肢は、私の経験の欠如をあまりにも多すぎるように思えます。 – arkate

答えて

7

私は主にswi-prologを使用していますので、私が言うことのほとんどはswi-prolog関連です。しかし、他のプロローグの実装でも同様の述語/ライブラリ(おそらく少し異なる名前)があるかもしれませんので、マニュアルを検索して見つけることができます。また、私はインタプリタではなくコンパイラをプロローグに書いているので、一部の部分はインタープリタ関連ではないかもしれません。

SWI-Prolog's documentation siteは、検索ボックスを使用して任意の述語を検索するか、一般的な検索を実行するのに本当に便利です。ライブラリは数多くありますが、経験を積むためにいくつかのものを自分で実装したいと思うかもしれません。あなたはホイールを再発明することになるかもしれませんが、それは役に立つでしょう。

「The Art of Prolog」(Sterling、Shapiro)には、プロローグでコンパイラを構築するための章があります(プロローグ用の素晴らしい本です)。

多分、プロローグ用のlex/bisonに相当するツールがあります。私は本当に検索したことはありません。
Imho、レクサーは簡単なプロローグで簡単です。当然、パターンマッチングに大きく依存します。

パーサーについては、DCGを使用することをお勧めします。明確な節の文法:swi-prolog doc、詳しくはgoogleをご覧ください。
問題は、ファイル全体を解析する必要があることです(少なくとも、それ以外の方法は見つけられていません)。 Btw、レクサーはDCGでもやることができますが、本当に良いとは思いません。

中間コードを使用することを選択した場合、抽象構文ツリーはパーサから簡単に作成できます(解析中に多くの要素を評価することもできます)。
セマンティックチェックについて:私のコンパイラでは、おもちゃの言語のために、構文解析中に意味チェック(スコープ関連、関数呼び出し)の大部分を行い、残りは別のステップで行います。それは少し厄介だ

他の有用なもの:、主張/ 1をチェックし、グローバル変数、meta predicates (maplist/[2-6]).
ない純粋なプロローグとあなたがそれらを悪用することにより、コードがあまりにも不可欠になるかもしれない(そして、あなたはいくつかの本当に厄介な副作用を持つことができます)

シンボルテーブルの場合(必要な場合)、assert/1を使用して述語を追加できます。swi-prologは動的述語に動的ハッシュテーブルを使用します。警告:動的述語は静的なものよりも遅いので、テーブルを完成し、変更を加えないときは、静的にするためにcompile_predicates/1を使用します。たとえば、私はSTの解析が完了したので、私はそれをコンパイルします。 STのもう1つのソリューションは、association listsです。それらはAVLツリーで実装されるので、コストはO(log(N))になります。

5

Markus Triska(here彼のホームページ)いくつかのことが面白いかもしれないことを示しています。例えば、toy LISP、またはいくつかのtoughtsからmeta interpreters

+0

インターネットの性質上、この回答は死んでおり、アーカイブのリンクです... https://web.archive.org/web/20121221085328/http://web.student.tuwien.ac.at/~e0225855 – oPless

+2

@oPless:ありがとう、リンクを調整しました – CapelliC

関連する問題