Compiler construction 编译器:左值和右值的代码生成

Compiler construction 编译器:左值和右值的代码生成,compiler-construction,Compiler Construction,我正在为一种类似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))

我正在为一种类似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函数也将返回一个整数对象

然而,fibx-1+fibx-2要求两个函数的结果为右值,因此它可以正确地执行加法


我想不出一个自动的方法来处理这个问题:如何找到一种方法,让编译器知道什么时候为左值生成代码,什么时候为右值生成代码?

我认为您可以忽略这个差异。将+视为对整数对象A、B取两个引用的函数,并返回对一个新对象的引用,该对象的值是A和B的总和。当然,这个函数必须由编译器实现,但除此之外,它应该与其他函数类似