私の大学で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
この特定のイベントであるブロックイベントには、ブロックの位置などの変数が含まれています。しかし、これはコンパイル時には分かりません。シンボルテーブルに値を挿入するときに、どうすればこのようなことを考慮に入れるのですか?
これは実際のスタックポインタの形で、スタック内で必要なバイト数(例えば32ビットIEEE浮動小数点数は4(32ビット))の "長さ"ですか? – Chraebe
@Chraebe通常、スタック* offset *として格納されます。つまり、現在のスタックフレームの先頭から値が格納されるまでのバイト数です。しかし、実際にはターゲット言語に依存しています。たとえば、Javaバイトコードをターゲットにしている場合は、LVAインデックスになると思います。 – Oak
さて、ありがとう、私は今、よく理解していると思う。 – Chraebe