2017-04-08 6 views
1

JavaScriptでパーザを書くと、どの言語でも、明らかにMapを使って名前のマッピングを変数に格納します。JavaScriptマップのシャドーイング

ほとんどの言語では、内部スコープ内のある変数または別の変数が、外部スコープ内の変数をシャドウすることができます。これを実装する理想的なデータ構造は機能マップです。それがなければ、2つの選択肢があるように思えます。

  1. それは、機能マップであるかのように地図を扱い、アウターマップのコピーを作成し、コピーに内部変数を追加し、それは内側のスコープが終了したときに収集したごみとします。これはエレガントですが、既存の変数を毎回コピーするのにO(N)時間を費やしています。そのため、ある時点で多くの変数が存在する場合は遅くなる可能性があります。

  2. 1つのマップを使用して、古いバインディングを保存し、内側のスコープの終わりに復元します。これは高速ですが、控えめでエラーが発生しやすいです。

もっと良いオプションがありますか?どのオプションが最善であるかについてコンセンサスがありますか?

+0

"*明らかにマップを使用して名前のマッピングを変数に格納します*" - なぜですか? – Bergi

+0

パーサーやインタープリタを書いていますか?パーサは実際の変数を格納する必要はありません。 – Bergi

+0

@Bergiまあ、今私は実際に実際の変数を格納する必要があるTPTPファイル形式のパーサーを書いています。 – rwallace

答えて

2

Mapオブジェクトのリンクリストを使用して、のチェーンを表します。識別子が最初のリンクに見つからない場合は、グローバルスコープまで再帰的にトラバースします。

+0

これはオプションです。これは、線形時間ルックアップを備えた単純な機能マップクラスを作成することになります。これは、変数が多数ある場合は遅くなる可能性があります。 – rwallace

+1

はい、基本的にはそうです。しかし、多くの変数を持つスコープでは線形よりもよく対処しますが、よくリンクされたプログラムでは、スコープを無期限に入れ子にしないので、チェーンリンクの数は通常は限定されています。だから全体的に私はまだ 'O(1)'アクセスを期待していました。 – Bergi

+1

より良いパフォーマンスが必要な場合は、参照結果をマイグレーションすることで比較的容易に最適化できます(スコープは静的で、マップに値ではない変数参照をチェーンに格納します)。 (つまり、エントリを遅延コピーする)、データ構造を透過的に保ちます。 – Bergi

関連する問題