1. 程式人生 > >Graduation Project——通過直譯器執行程式

Graduation Project——通過直譯器執行程式

現在我們得到了抽象語法樹,程式的執行就簡單了。直譯器只需從抽象語法樹的根節點開始遍歷該樹直到葉節點,並且計算各節點的內容即可。這就是直譯器的基本實現原理。

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方法。

最後的程式碼如下:

https://github.com/BonjourMondo/IDE

我們就還差一個演奏序列沒有完成了。至此,核心演算法差不多完成了。最後的序列等我有空再更吧。