2012-01-12 17 views
0

C言語でインタープリタを書くにはどうすればいいですか?また、どのように動作しますか?C#で単純なロゴのようなインタプリタを書くには?

通常のインタプリタ(Python)に関する他の情報、if文の読み込み方法、式の計算方法など - あるいはpesudoコードさえも高く評価されます。

+0

http://stackoverflow.com/questions/1832293/c-sharp-scripting-language – Brian

+0

レクサー(ソース) - >パーサー(トークン) - >抽象構文ツリー - >解釈 – mclaassen

答えて

1

インタプリタを書くことは必ずしも大きな仕事ではありませんが、一般的に構造化アプローチと強力なコーディングスキルが必要です。

まずトークン化は、同様に、1つのスロットずつ取るコード、刺す、キーワード、オペレータなど、すべてのすべてのコンポーネントのリストを作る:

  1. 印刷
  2. 「こんにちは\ "世界の\"」

は、これはあまりにも難しいことではありません。

ここで、コード内の位置などに応じて識別子の分類を行います。関数呼び出し、演算子、変数などであるかどうかを判断できるはずです。

ブラケットマッチングは、マッチしない括弧のスタックを更新しながらリストを実行します。括弧が一致すると、それをスタックから削除し、マッチする括弧をリンクしてそれぞれにポインタを与えます。

リストをツリーにする必要があります。ブロックすることができます。ブラケットのすべてのペアはブロックを作成し、言語に応じて、他の構造がブラケットのようなブロックを構成します。 (begin-endステートメントなども括弧のように扱うことができます)。そのようなブロックは、リスト上の単一の要素にすべてのサブ要素のリストを含んでいます。その後、各演算子優先レベルごとにツリーを一度走査し、それらの演算子をブロックします。

すべての変数と関数のリストをスコープごとに作成し、衝突がないことを確認できます。

各スコープについて、メモリのブロックを立ててそれぞれがどこに行くのかを正確に知ることができるように、変数の順序付きリストを作成します。

変数と関数名をそれぞれメモリブロックの場所と関数の宣言へのリンクに置き換えます。

これで、プログラムを完全にコンパイルするか、インタプリタで実行することができます。

実行するには、呼び出しスタックリストと一致するスコープリストを作成します。関数が呼び出されるたびに、呼び出しスタック内の戻り位置をメモし、一致したスコープを立てます。終了すると、スコープが破棄され、戻り位置に戻ります。

ifがある場合は、最初のブロックが偽に評価された場合は2番目のブロックが続き、2番目のブロックがスキップされることがわかっている場合は、通常の言語構造が処理しやすくなります。同様に、ループやその他の構造体は、固定数のブロックで構成されているとみなして処理するのが簡単です。いくつかの些細な規則で各ブロックをいつ実行するかを指定します。


私はあなたに構造化アプローチを与えました。これを実装するスキルは保証できません。無限の可能性のあるパフォーマンスの調整があり、実装する方法を明示していない多くのものがあります。

関連する問題