本章内容 ·中间代码表示 抽象语法树 一三地址代码:X=yopZ ·静态类型检查 类型检查( type checking) 语法分析之后的抽象语法( yntax检查,比如 break的位置 goto的 目标 中间代码生成
本章内容 • 中间代码表示 – 抽象语法树 – 三地址代码:x=y op z • 静态类型检查 – 类型检查(type checking) – 语法分析之后的抽象语法(syntax)检查,比如 break的位置,goto的目标…. • 中间代码生成
编译器前端的逻辑结构 语法 静态检 中间代码 中间 代码 分析器 查程序 生成器 代码 生成器 前端 —后端 图6-1一个编译器前端的逻辑结构
编译器前端的逻辑结构
三地址代码(1) ·每条指令右侧最多有一个远算符 般情况可以写成ⅹ=yopZ 允许的远算分量 名字:源程序中的名字作为三地址代码的地址 常量:源程序中出现或生成的常量 编译器生成的临时变量
三地址代码(1) • 每条指令右侧最多有一个运算符 – 一般情况可以写成x = y op z • 允许的运算分量: – 名字:源程序中的名字作为三地址代码的地址 – 常量:源程序中出现或生成的常量 – 编译器生成的临时变量
地址代码(2) 指令集合(1) 运算赋值指令:ⅹ=yopz X=op y 复制指令:Xy 无条件转移指令: goto L 条件转移指令: if x goto L if False x goto L 条件转移指令: if x relop y goto L
三地址代码(2) • 指令集合(1) – 运算/赋值指令:x=y op z x = op y – 复制指令:x=y – 无条件转移指令:goto L – 条件转移指令:if x goto L if False x goto L – 条件转移指令:if x relop y goto L
地址代码(3) 指令集合(2) 过程调用/返回: param xI ∥设置参数 param x2 param Xn call p,n ∥调用子过程p,n为参数个数 带下标的复制指令:X=y[ x[1= 注意:1表示离开数组位置第个字节,而不是数组的第 个元素 地址/指针赋值指令: Xay
三地址代码(3) • 指令集合(2) – 过程调用/返回: • param x1 //设置参数 • param x2 • … • param xn • call p, n //调用子过程p,n为参数个数 – 带下标的复制指令:x=y[i] x[i]=y • 注意:i表示离开数组位置第i个字节,而不是数组的第i 个元素 – 地址/指针赋值指令: • x=&y x=*y *x=y