12

F#を使用してASTを解析し、インタープリターを構築するための最良の方法は何ですか?簡単な構文(基本的な算術演算)のF#の例はたくさんありますが、機能の範囲がはるかに広い言語では何も見つからないようです。

識別された共用体は非常に便利に見えますが、多数のオプションを備えた共用体をどのように構築しますか?タイプ(加算、減算、条件、制御フローなど)を他の場所で定義し、それらを結合内の事前定義されたタイプとしてまとめる方がよいでしょうか?

それとも、通訳を書くためのはるかに効果的な手段を逃したことがありますか?タイプごとにeval関数を使用する方が効果的ですか、それともモナドを使用するのでしょうか。

前もって感謝します

4

6 に答える 6

14

識別された共用体は非常に便利に見えますが、多数のオプションを備えた共用体をどのように構築しますか?タイプ(加算、減算、条件、制御フローなど)を他の場所で定義し、それらを結合内の事前定義されたタイプとしてまとめる方がよいでしょうか?

ここで何を求めているのかわかりません。オプションが多数ある場合でも、DUの定義は簡単です。小さな言語のDU構造(およびツリー変換の記述に関するより一般的な議論)については、たとえばこのブログエントリを参照してください。より多くのケースを備えたDUがあれば問題ありませんが、コンパイラー/インタープリターではそのような表現を使用するのが一般的です。

構文解析に関しては、私はモナディックパーサーコンビネーターを好みます。FParsecをチェックするか、この古いブログエントリを参照してください。このようなパーサーコンビネーターを使用した後は、lex / yacc/ANTLRのようなものに戻ることはできません。外部DSLは比較すると非常に原始的です。

(編集:あなたが見つけた「小さな算術の例」は、おそらくより大きなソリューションがどのように見えるかをかなり表しています。「おもちゃ」の例は通常、正しいアーキテクチャを示しています。)

于 2010-01-13T16:28:57.970 に答える
3

Robert Pickeringの「BeginningF#」のコピーを取る必要があります。

第13章「テキストの解析」には、 Noldorinによって提案されたFsLexFsYaccの例が含まれています。

それ以外に、同じ本の第12章で、著者は、彼が提案する算術言語用の実際の単純なコンパイラーを構築する方法を説明しています。非常に啓発的です。最も重要な部分は、探しているもの、つまりASTパーサーです。

幸運を。

于 2010-01-13T16:26:00.237 に答える
3

私はFParsecを見てみるというブライアンの提案を2番目にしています。FsLexとFsYaccを使って昔ながらの方法で物事を行うことに興味がある場合、重要な言語を解析する方法を探す1つの場所は、F#ソース自体です。source\fsharp\FSharp.Compilerディストリビューションのディレクトリを参照してください。

于 2010-01-13T16:34:11.500 に答える
2

私は自分で通訳をしていません。以下がお役に立てば幸いです:)

これは、 MLを使用してエール大学で教えられているコンパイラコースです。講義ノートは非常に簡潔(短く)で有益です。最初のいくつかの講義ノートと課題に従うことができます。F#をご存知のように、MLプログラムの読み取りに問題はありません。

ところで、教授はSML実装の作成者であるA.Appelの学生でした。したがって、これらのメモから、MLファミリー言語でコンパイラー/インタープリターを作成する最も自然な方法も得られます。

于 2010-01-13T16:09:04.780 に答える
2

F#WikiBookの字句解析と構文解析のセクションをチェックするのは興味深いかもしれません。F#PowerPackライブラリには、これを大幅に支援するFsLexおよびFsYaccツールが含まれています。ウィキブックスガイドは、これを始めるための良い方法です。

それを超えて、コンパイラとインタプリタの両方の設計に共通するASTフォームからコードを実際にどのように実行するかを考える必要があります。ただし、これは一般的に簡単な部分と見なされており、コンパイラ/インタプリタに関する一般的なリソースがたくさんあり、これに関する情報を提供する必要があります。

于 2010-01-13T16:09:26.760 に答える
0

これは、F#とFParsecを使用した完全なSmallBasic実装の優れた例です。ILコンパイラも含まれています。コード全体は非常にアクセスしやすく、http://trelford.com/blog/で作成者からの一連のブログ投稿が付属しています。

于 2015-03-02T16:08:19.753 に答える