编译器-基于AST表达式代码生成

pseudo code:

struct node
{
    type(Op,var,name);
    op(Add,Sub,Div,Mult);
    val;
    base;
    offset;
    left;
    right;
}

Emit(Op,src1,src2,des);

GetNextReg();

Expr(node)
{
    int t1,t2,res;
    switch(node.type){
        case num:
            rest = GetNextReg();
            Emit(loadI,node.val,NULL,res);
            break;
       
        case var:
            res = GetNextReg();
            Emit(loadAI,node.base,node.offset,res)
            break;
        
        case Op:
            t1 = Expr(node.left);
            t2 = Expr(node.right);
            rest = GetNextReg();
            Emit(Op.op,t1,t2,res);
            break;
    }
    return res;
}

A * 3 + b 

首先第一步call root 加号+ 调用Expr函数 push进栈中 +是Op 所以会call t1 = Expr(node.left);
root node的left node是乘号*

然后再次进入到Op中的t1 = Expr(node.left);

接下来会进入case var 并生成instruction 

接下来return后 就回到了乘号Op的t1 = Expr(node.left); 接下来执行下一行t2 = Expr(node.right);
并生成instruction

接下来执行完r1和r2了以后 执行getNextReg会得到r3 然后下一行生成了instrctuon

这时候乘号*已经全部执行完毕 返回

这时回到加号+ t1 = Expr(node.left);已经执行完毕 return r3 开始执行t2 = Expr(node.right);

执行完t2 = Expr(node.right); 返回r4    下一行getNextReg会返回r5 然后执行Emit生成instruction

猜你喜欢

转载自blog.csdn.net/weixin_43754049/article/details/126337126