2

私の大学でSemesterプロジェクトとしてMinecraftでボットを作成するための独自のプログラミング言語のコンパイラを作成しています。今まで私はANTLRでパーサーを作成し、独自の抽象構文木構造を作成し、ANTLRビジターを使用してASTを作成しました。私は文脈分析段階にあり、現在はシンボルテーブルを作成しており、その構造を制御しています。私のSymbolTableクラスは次のようになります:Javaでシンボルテーブルを作成するときにコンパイル時に未知の変数値を考慮する

public class SymbolTable { 
    private HashMap<String, Symbol> ST = new HashMap<>(); 
    public SymbolTable parent; 
    public LinkedList<SymbolTable> children = new LinkedList<>(); 
    public String kind; 
    public String id; 

    public SymbolTable(String kind, String id){ 
     this.kind = kind; 
     this.id = id; 
    } 

    public void put(String id, Symbol val){ 
     ST.put(id, val); 
    } 

    public Symbol get(String id){ 
     if(ST.containsKey(id)) { 
      return ST.get(id); 
     } 
     else{ 
      try { 
       return parent.get(id); 
      } 
      catch(NullPointerException e){ 
       return null; 
      } 
     } 
    } 

    public boolean contains(String id){ 
     if(ST.containsKey(id)) { 
      return true; 
     } 
     else{ 
      if(parent == null){ 
       return false; 
      } 
      return parent.contains(id); 
     } 
    } 

    public String prettyPrint(){ 
     String st = "(TABLE " + this.kind + " " + this.id + " " + ST.toString(); 

     for(SymbolTable nst : children){ 
      st = st.concat(" " + nst.prettyPrint()); 
     } 

     st = st.concat(")"); 

     return st; 
    } 

    public boolean isFunction(){ 
     if(this.kind == "fun"){ 
      return true; 
     } 
     else if(!(this.parent == null)){ 
      return this.parent.isFunction(); 
     } 
     else{ 
      return false; 
     } 
    } 
} 

変数と関数をシンボルテーブルに入れることは問題ありません。私はこのように、そのための私の訪問者メソッドを使用します。

@Override 
public Symbol visitStrVarCond(StrVarCondNode node){ return new StringSymbol("var", "string", node.val); } 

しかし、私の知る限り理解し、例えばシンボルテーブル内のシンボルの値(変数の値、または関数の戻り値)もシンボルテーブルに存在する必要があります。これはまったく問題ではなく、これは私がすでにできることです。

私の問題は、しかし、次のとおりです。

プログラマが使用する可能性のある値のいくつかは、コンパイル時には不明です。これらは、特定のプログラムの実行時にのみ認識されます。たとえば、プレーヤーの現在の位置、在庫スロット内の特定のアイテムなどです。私の言語にはイベントがあります。たとえば、特定のブロックが検出されるまでボットを掘りたい場合、

event block(12:0) 
    // do stuff 
end event 

この特定のイベントであるブロックイベントには、ブロックの位置などの変数が含まれています。しかし、これはコンパイル時には分かりません。シンボルテーブルに値を挿入するときに、どうすればこのようなことを考慮に入れるのですか?

答えて

1

しかし、私が理解する限り、シンボルテーブルのシンボル値(変数の値や関数の戻り値など)もシンボルテーブルに存在する必要があります。シンボルテーブル内のシンボルの

位置が存在する必要がある - 古典的オフセットスタックの形で。実際のの値は、通常、コンパイル時には不明です。

たとえば、x = yのようなものと考えてください。シンボルテーブルの目的は、コンパイラが型の検証(該当する言語での)のために、xyの型が何であるかを知り、それが発行する "ロード"命令と "ストア"命令のアドレスオペランドを知ることです。しかし、xに格納されている実際の値が何であるか分からずに出力コードを生成することはできます。

+0

これは実際のスタックポインタの形で、スタック内で必要なバイト数(例えば32ビットIEEE浮動小数点数は4(32ビット))の "長さ"ですか? – Chraebe

+0

@Chraebe通常、スタック* offset *として格納されます。つまり、現在のスタックフレームの先頭から値が格納されるまでのバイト数です。しかし、実際にはターゲット言語に依存しています。たとえば、Javaバイトコードをターゲットにしている場合は、LVAインデックスになると思います。 – Oak

+0

さて、ありがとう、私は今、よく理解していると思う。 – Chraebe

関連する問題