编译原理教案(7)

2019-04-21 17:41

后向前扫描,对每个变量建立相应的待用信息链与活跃信息链。如果没有进行数据流分析并且临时变量不允许跨基本块引用,则把基本块中的临时变量均看作基本块出口之后的非活跃变量,而把所有的非临时变量均看作基本块出口之后的活跃变量。如果某些临时变量能够跨基本块使用,则把这些临时变量也看成基本块出口之后的活跃变量。 例 考察基本块: (1) T=A?B (2) U=A?C (3) V=T+U (4) D=V+U

其中,A、B、C、D为变量,T、U、V为中间变量,试求各变量的待用信息链和活跃信息链。

[解] 我们根据计算变量待用信息的算法得到各变量的待用信息链和活跃信息链如表所示。表中的“F”表示“非待用”或“非活跃”,“L”表示“活跃”,(1)~(4)分别表示基本块中的四个四元式。待用信息链和活跃信息链的每列从左到右为每行从后向前扫描一个四元式时相应变量的信息变化情况(空白处表示没

有变化)。

表2 例2-8的待用信息链和活跃信息链

变量名 T A B C U V D

初值 F F F F F F F

待 用 信 息

待 用 信 息 链 (3) (3) F

(2) (2) F

F (1) (1)

初值 F L L L F F L

活 跃 信 息

活 跃 信 息 链 L L F

L L F

L L F

F L L

(4) (4) F

待用信息和活跃信息在四元式上的标记如下: (1) T(3)L=A(2)L ? BFL (2) U(3)L=AFL ? CFL (3) V(4)L=TFF+U(4)L (4) DFL=VFF+UFF

假设基本块中每个四元式的形式都是A=B op C,则代码生成算法是对每个四元式i:A=B op C执行下述步骤:

(1) 调用函数GETREG (i:A=B op C)返回存放A值结果的寄存器R。 (2) 通过地址描述数组AVALUE [B]和AVALUE [C]确定出变量B和变量C的现行值存放位置B'和C';如果是存放在寄存器中,则把寄存器取作B'和C'。

(3) 如果B'≠R,则生成目标代码: MOV R, B' op R, C'

否则生成目标代码: op R, C'

如果B'或C'为R,则删除AVALUE [B]或AVALUE [C]中的R。 (4) 令AVALUE[A]={R}并令RVALUE[R]={A},表示变量A的现行值只在R中且R中的值只代表A的现行值。

(5) 如果B和C的现行值在基本块中不再被引用,它们也不是基本块出口之后的活跃变量且它们的现行值存放在寄存器Rk中,则删除RVALUE [Rk]中的B和C以及AVALUE [B]中的Rk,使寄存器Rk不再为B和C所占用。 源程序到目标代码生成示例

我们以PC机的汇编语言作为目标代码,且假定可用的寄存器为AX、BX、CX

和DX,则一C语言源程序转换为四元式代码序列,然后再转换为目标代码程序(转换中不考虑优化)的结果如下:

(1) C语言源程序(局部) while (a>b) {

if (m>=n) a=a+1; else

while (k==h) x=x+2; m=n+x*(m+y); }

(2) 四元式代码序列 100 (j>, a, b, 102) 101 (j, _, _, 117 ) 102 (j>=, m, n, 104) 103 (j, _, _, 107 ) 104 (+, a, 1, T1) 105 (=, T1, _ , a ) 106 (j, _, _, 112) 107 (j=, k, h, 109 ) 108 (j, _, _, 112) 109 (+, x , 2, T2 ) 110 (=, T2, _ , x ) 111 (j, _, _, 107 ) 112 (+, m, y, T3) 113 (*, x, T3, T4 ) 114 (+, n , T4, T5) 115 (=, T5, _ , m ) 116 (j , _, _, 100)

(3) 目标代码程序 (汇编语言程序) ; File: compile.asm

; ************************************ data segment ; 定义数据段 h DW

k DW m

DW

n DW x DW a DW

DW

y DW b

data ends ; 数据段定义结束 ; ************************************ code segment main proc far start: push ds sub bx, bx push bx

mov bx, data mov ds, bx

; 语句翻译由此开始: 100: mov AX, a cmp AX, b jg 102 101: mp 117 102: mov AX, m cmp AX, n jge 104 103: jmp 107 104: mov AX, a add AX, 1D 105: mov BX, AX mov a, BX 106: jmp 112 107: mov AX, k cmp AX, h

; 跳出基本块前保存寄存器中已改变的变量值 ; 设置DS段为当前数据段 ; 定义代码段 ; 程序的执行部分

assum cs:code, ds:data

je 109 108: jmp 112 109: mov AX, x add AX, 2D 110: mov BX, AX mov x, BX 111: jmp 107 112: mov AX, m add AX, y 113: mul x 114: mov BX, n add BX, AX 115: mov CX, BX mov m, CX 116: jmp 100 117: ret main endp

code ends ; 代码段定义结束 end start

; 跳出基本块前保存寄存器中已改变的变量值 ; 跳出基本块前保存寄存器中已改变的变量值

第8章 符号表和错误处理

主要内容:

1 符号表 2 错误处理

符号表

由于处理对象的作用和作用域可以有多种,所以符号表也有多种组织方式。按照处理对象的特点,符号表的组织方式一般可分为直接方式和间接方式。

直接方式是指在符号表中直接填入源程序中定义的标识符及相关信息


编译原理教案(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018-2019-入党积极分子登记表考察意见-word范文 (4页)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: