Graduation Project——通過直譯器執行程式
阿新 • • 發佈:2019-01-04
現在我們得到了抽象語法樹,程式的執行就簡單了。直譯器只需從抽象語法樹的根節點開始遍歷該樹直到葉節點,並且計算各節點的內容即可。這就是直譯器的基本實現原理。
eval方法與環境物件
要根據得到的抽象語法樹來執行程式,各個語法樹節點物件的類都需要具備eval方法。
eval是evalueate的縮寫。它計算該節點為根的子樹對應的語句,表示式以及子表示式,並返回執行結果。因此只要呼叫抽象語法樹的根節點物件的eval方法,就能完整執行該語法樹對應的程式。
所以對於不同的節點,eval方法有不同的定義。
譬如計算13+x*2的例子:
我們的程式碼是這樣的:
public Object eval (Environment env){
Object left =left().eval(env);
Object right=right().eval(env);
return (Integer)left+(Integer)right;
}
有點遞迴的意味。
Stone語言支援變數的程式設計語言將環境物件(environment)傳遞給eval方法。簡單來說,它以HashSet來呈現,當程式中出現新的變數的時候,由該變數的名稱與初始值構成的鍵值對被新增到Hash表中。
package stone.env;
public interface Environment {
void put(String name, Object value);
Object get(String name);
}
實現的思路非常直接,put用於加入鍵值對,get用於按鍵來獲取相應的值。
package stone.env;
import java.util.HashMap;
public class BasicEnv implements Environment {
protected HashMap<String,Object>values;
public BasicEnv(){
values=new HashMap <>();
}
@Override
public void put(String name, Object value) {
values.put(name,value);
}
@Override
public Object get(String name) {
return values.get(name);
}
}
各種型別的eval方法
我在這個包內所有的類,除了Null和PrimaryExpr,都加入了一個eval方法。
最後的程式碼如下:
我們就還差一個演奏序列沒有完成了。至此,核心演算法差不多完成了。最後的序列等我有空再更吧。