【问题标题】:Compiler: code generation for lvalue and rvalue编译器:左值和右值的代码生成
【发布时间】:2017-05-09 01:40:23
【问题描述】:

我正在为类似 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) 要求两个函数的结果都是右值,所以它可以正确地执行加法。

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

【问题讨论】:

    标签: compiler-construction


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多