中间代码生成

源程序的中间表示可以有多种形式:

  • 三地址码(Three-address Code):三地址码由类似于汇编语言的指令序列组成,每个指令最多由三个操作数(operand).

    常用的三地址指令

    指令类型 指令形式
    赋值指令 x = y op z x = op y
    复制指令 x = y
    条件跳转 if x relop y goto n
    非条件跳转 goto n
    参数传递 param x
    过程调用 call p,n
    过程返回 return x
    数组引用 x = y[i]
    数组赋值 x[i] = y
    地址及指针操作 x =&y x =* y *x = y

    红色部分表示指令的操作符,先看x = y op z,op为二元运算符,yz是两个运算分量的地址,x是运算结果存放地址。

    为了方便起见,我们可以用源程序中的名字也就是标识符来作为三地址指令中的地址。因为每个标识符对应的地址都存放在符号表中,因此通过这些名字就可以找到它们的地址。

    另外,常量(Constant)或者编译器生成的临时变量也可以作为三地址指令的地址。

    三地址指令的表示

    四元式(Quadruples): (op,y,z,x)

    三元式(Triples)

    间接三元式(Indirect Triples)

    以四元式为例,四元式由四个分量构成,第一个分量为操作符,后面三个分量表示操作数。

    x = y op z ( op , y , z , x )
    x = op y ( op , y , _ , x )
    x = y ( = , y , _ , x )
    if x relop y goto n( relop , x , y , n )
    goto n ( goto , _ , _ , n )
    param x (param, _ , _ , x )
    call p, n ( call , p , n , _ )
    return x (return, _ , _ , x )
    x = y[i] ( =[] , y , i , x )
    x[i] = y ( []= , y , x , i )
    x = &y ( & , y , _ , x ) x =*y ( =* , y , _ , x )
    *x = y ( *= , y , _ , x )

  • 语法结构树/语法树(Syntax Trees),与语法分析树不是一回事。

最后修改日期:2020年5月23日

留言

撰写回覆或留言