2017-05-09 68 views
0

我正在爲類java語言編寫一個小型編譯器,除了每個東西都是這種語言的對象,即使是原始類型。編譯器:左值和右值的代碼生成

考慮下面的代碼:

class Main inherits IO { 

    fib(x : Int) : Int { 
     if x < 2 
     then x 
     else fib(x - 1) + fib(x - 2) 
     fi 
    }; 

    main() : Object { 
     out_int(fib(10)) 
    }; 
}; 

在我的實現,即進入一個功能是參考該對象的副本的一切。 (所以10是一個整數對象)。所以fib函數也會返回一個整數對象。

但是,fib(x - 1) + fib(x - 2)要求兩個函數的結果是右值,所以它可以正確執行加法。

我不能想出一個自動的方式來處理這個問題:如何找到一種方式,以便編譯器知道什麼時候爲左值生成代碼以及何時爲右值?

回答

1

我認爲你可以忽略不同。考慮將+作爲一個函數,它接受兩個對整數對象a,b的引用,並將引用返回給值爲ab之和的新對象。當然,這個函數必須由編譯器來實現,但除此之外它應該與其他函數類似。