2017-05-19 4 views
1

私はインタラクティブなフィクションゲームのカスタムプログラミング言語を開発しています。言語はコンパイルされることを意図したものではなく、Pythonのようなインタプリタ言語のものです。私はC#でパーサーを構築しています。このインタプリタを構築する際に、私はメモリ内のスコープをどのように表現するかについて質問をしました。私はすべての変数を特別な変数クラスに格納しています。内部スコープの表現のためのデータ構造が必要です

public class scope 
    { 
     public List<variable> variables; 
     public scope() 
     { 
      variables = new List<variable>(); 
     } 
    } 

質問は、データ構造のどのような私は簡単にこれらのスコープを保存するために使用することができますされています。また

public class variable 
    { 
     public string str; 
     public DataType datatype; //an enum with all datatypes supported by the language 
     public int id; 
     private static int increment; 
     public variable(string str, DataType datatype) 
     { 
      this.str = str; 
      this.datatype = datatype; 
      this.id = increment; 
      increment++; 
     } 
    } 

は、私は特定の範囲内にある変数を保持するための特別なスコープのクラスを持っています特定のスコープからアクセス可能なすべてのスコープ(したがって、それらのスコープ内の変数)をすばやくループすることができますか?私は木のような何かが必要です。

答えて

1

伝統的にスコープはStackのデータ構造で表されています。基本的には、中括弧構文でうまく動作します。基本的には、{に遭遇したときに新しいものをプッシュし、}にポップすることができます。

限り使用可能な変数を決定するなど、非常に単純な(ブルートフォース、いえ)メソッドはSelectManyを使用することです:

bool variableExists = currentScopes.SelectMany(s => s.Variables).Any(v => v.Value.Name == variableName); 

さておき、あなたが実際にためインタプリタを書いていると解釈される言語。すべてのプログラミング言語が解析されます。

関連する問題