Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
58 lines (39 sloc) 1.59 KB

2.8 节的练习

2.8.1

C 语言和 JAVA 语言中的 for 语句具有如下形式:

for(expr1; expr2; expr3) stmt

第一个表达式在循环之前执行,它通常被用来初始化循环下标。第二个表达式是一个测试,它在循环的每次迭代之前执行。如果这个表达式的结果变成0,就退出循环。循环本省可以看做语句 {stmt expr3}。第三个表达式在每一次迭代的末尾执行,它通常用来使循环下标递增。故 for 语句的含义类似于:

expr1; while(expr2){stmt expr3;}

仿照图 2-43 中的类 If,为 for 语句定义一个类 For。

解答

class For extends Stmt{
    Expr E1;
    Expr E2;
    Expr E3;
    Stmt S;
    public For(Expr expr1, Expr expr2, Expr expr3, Stmt stmt){
        E1 = expr1;
        E2 = expr2;
        E3 = expr3;
        S = stmt;
    }
    public void gen(){
        E1.gen();
        Label start = new Lable();
        Lalel end = new Lable();
        emit("ifFalse " + E2.rvalue().toString() + " goto " + end);
        S.gen();
        E3.gen();
        emit("goto " + start);
        emit(end + ":")
    }
}

2.8.2

程序设计语言 C 中没有布尔类型。试说明 C 语言的编译器可能使用什么将一个 if 语句翻译成三地址代码。

解答

将:

emit("isFalse " + E.rvalue().toString() + " goto " + after);

换成:

emit("ifNotEqual " + E.rvalue().toString() + " 0 goto " + after);

或者:

emit("isNotEqualZero " + E.rvalue().toString() + " goto " + after);